以下语法来自于Java8
Lambda是一种匿名函数,函数的作用是接受一个输入,得到一个输出(也可能不需要输出,仅利用其执行的副作用)。
利用Lambda可以封装变化,写出更灵活的代码。
举一个例子
假如有这样一个类
public Person {
String firstName;
String lastName;
}
如果想将Person作为一个String输出,以西方的习惯,可以定义一个成员函数
public String printWestern() {
System.out.println(lastName + " " + firstName);
}
这时如果有一个需要变化,想要以东方的方式输出,则需要修改源代码,再添加一个成员函数
public String printEastern() {
System.out.println(firstName + " " + lastName);
}
如果还想以其它方式输出呢?是不是还需要修改源代码,重新编译?
这里,变化的是输出的方式。而输出方式却是由函数定义的。
暂时放下,想想另一个话题-变量
对以下代码
foobar.setWidth(8);
都知道需要设置一个变量,然后再传入进入
int width = 8;
foobar.setWidth(width);
这样变量的值可以在运行时,从数据库读入,交互方式输入,或从文件读入,这样就可以不改变源代码,从而改变程序的行为。
如果函数也可以像变量一样,岂不可以改善前面的问题了吗?
Lambda就是一种方法。
利用Lambda后可以这样写
public String printCustom(Function<Person, String) f) {
return f.apply(this);
}
客户程序可以这样
Function<Person, String> westernStyle = p -> {
return lastName + " " + firstName;
}
person.printCustom(westernStyle);
Function<Person, String> easternStyle = p -> {
return firstName + " " + lastName;
}
person.printCustom(easternStyle);
这里,函数就可以将变量一样使用了。
如果在一个程序语言中,函数
- 可以赋值给变量
- 做为形参传入另一函数
- 做为函数返回值返回
那么可以称其为first class citizen
注:
以上例子来自于Lambda Qucik Start,更详细的介绍请参考原文。