Lambda表达式是一个匿名函数。C++ 11和 java 8 相继引入了有关对Lambda表达式的支持。
Lambda表达式对于高级语言而言并不是必要的,对于Java而言它的功能和一个简易的接口差不多,而C++也有传统的函数指针。但即便如此,lambda表达式还是一项颇受重视的高级语言新特性,因为它可以大大简化我们的代码,也提供了一条函数式编程的捷径。
简而言之,一个Lambda表达式可以看作一个变量。对于这种变量的类型java语言中引入了很多种。我们主要来研究使用比较多的Function接口。他是一个有两个泛型参数的接口,其中一个是返回值的类型,一个是参数的类型(注意这个接口只接受一个参数)。在java中,它可以被赋值为一个类静态方法、对象的方法、函数式接口,当然也包括我们提到的Lambda表达式。这里就要和C++的function类区分开了。在C++中,function接受的泛型是一个更格式化的函数声明格式,它可以接受更多的参数。因此虽然这两个function看似很亲近,实际上区别还是挺大的。这也是Java提供更多函数类型的原因。
下面是一个非常简单的示例,通过示例我们可以看出二者lambda表达式和所谓的function类型的不同。但是总体上而言大同小异。
java:
import java.util.function.Function; public class Test { public static Function<Integer,Integer> getFactorial; public static Function<Integer,Integer> getSum; public static Function<Integer,Integer> getMaxBase4; public static void main(String[] args) { loadingFunctions(); getResult(getFactorial, "10的阶乘是:"); getResult(getSum, "10的和是:"); getResult(getMaxBase4, "10的以内4的倍数的最大值是:"); } public static void getResult(Function<Integer, Integer> f, String functionType) { System.out.println(functionType + f.apply(10)); } public static void loadingFunctions() { getFactorial = (n) -> { n--; if(n == 0) return 1; else return (n+1) * getFactorial.apply(n); }; getSum = (n) -> { n--; if(n == 0) return 1; else return (n+1) + getSum.apply(n); }; getMaxBase4 = (n) -> { int last = -1; while(n > 3) { if(n % 4 == 0) { last = n; break; } n--; } return last; }; } }
c++:
#include <iostream> #include <string> #include <functional> using namespace std; function<int(int)> getFactorial; function<int(int)> getSum; function<int(int)> getMaxBase4; void getResult(function<int(int)> f, string functionName) { cout << functionName << ) << endl; } void loadingFunctions() { getFactorial = [](int n) { n--; ) ; else )*getFactorial(n); }; getSum = [](int n) { n--; ) ; else ) + getSum(n); }; getMaxBase4 = [](int n) { ; ) { == ) { last = n; break; } n--; } return last; }; } int main() { loadingFunctions(); getResult(getFactorial, "10的阶乘"); getResult(getSum, "10的和"); getResult(getMaxBase4, "10以下4的倍数的最大值"); cout << "--------" << endl; system("pause"); }
这两个示例中,我们可以看到我们虽然都调用同一个getResult方法,而打印的结果是不同的,原因就是我们传入了不同的方法函数作为参数。用这种function类型作为参数可以大大的简化我们的代码。