lambda表达式是从匿名类演变来的,主要就是为了简化代码的编写。 lambda表达式只适用于functional interface,即只有一个default方法的接口
lambda表达式可以访问其所在的块的本地变量,但是它不具备类型遮蔽功能。在表达式内部声明的变量,会被编译器解释成所在块内声明的变量
同样的,类似本地类,lambda表达式能否访问的块内本地变量必须是final或者effectively final,否则会有编译器错误
class Test {
public String words = "ooxx";
interface HelloWorld {
public void sayHi();
}
public void sayHello() {
String words = "nihao";
/*
* 不适用匿名类的方式
* HelloWorld chineseSay = new HelloWorld() {
* public void sayHi() {
* System.out.println("你好");
* }
* };
* chineseSay.sayHi();
*/
HelloWorld chineseSay = () -> {
/* 在表达式内声明变量会导致编译错误 */
// String words1 = "xxx";
System.out.println(words);
System.out.println(Test.this.words);
};
chineseSay.sayHi();
}
public static void main(String[] args) {
Test test = new Test();
test.sayHello();
}
}
方法引用
如果lambda表达式要做的功能,已经有一个现成的方法可以提供,那么就通过方法引用来在表达式内使用这个方法
kind | syntax |
---|---|
引用静态方法 | ContainingClass::staticMethodName |
引用具体类的实例方法 | containingClass::instanceMethodName |
引用抽象类或具体类型的实例方法 | ContainingType::methodName |
引用构造函数 | ClassName::new |
import java.util.function.BiFunction;
public class MethodReference {
public static void main(String[] args) {
// calling the method mergeThings with a lambda expression
System.out.println(MethodReference.mergeThings("hello", "world", (a, b) -> a + b));
// reference to a static method
System.out.println(MethodReference.mergeThings("hello", "world", MethodReference::appendStrings));
// reference to an instance method of a particular object
MethodReference myApp = new MethodReference();
System.out.println(MethodReference.mergeThings("hello", "world", myApp::appendString2));
// reference to an instance method of an arbitrary object of a particular type
System.out.println(MethodReference.mergeThings("hello", "world", String::concat));
}
public static <T> T mergeThings(T a, T b, BiFunction<T, T, T> merger) {
return merger.apply(a, b);
}
public static String appendStrings(String a, String b) {
return a + b;
}
public String appendString2(String a, String b) {
return a + b;
}
}