Lambda表达式与函数式接口详解?
请详细解释Java 8引入的Lambda表达式的语法和本质(函数式接口的实例),列举常用的函数式接口(Function/Consumer/Predicate/Supplier),并说明方法引用(Method Reference)的四种形式。
回答
苦行僧
Lambda表达式:函数式接口的匿名实现类的简化写法。
// 传统匿名内部类
Runnable r = new Runnable() { public void run() { System.out.println("Hi"); } };
// Lambda
Runnable r = () -> System.out.println("Hi");
语法:(参数列表) -> { 方法体 } 或 参数 -> 表达式
核心函数式接口(java.util.function包):
- Function<T,R>:接收T返回R,方法apply()
- Consumer:接收T无返回,方法accept()
- Predicate:接收T返回boolean,方法test()
- Supplier:无参数返回T,方法get()
- UnaryOperator:T→T,继承Function
- BinaryOperator:(T,T)→T
方法引用(::操作符):
- 静态方法引用:
ClassName::staticMethod→Math::max - 实例方法引用:
instance::method→list::add - 特定类任意对象方法引用:
ClassName::method→String::length - 构造方法引用:
ClassName::new→ArrayList::new
注意:Lambda表达式中的this指向外部类(不同于匿名内部类中指向自身);Lambda访问的局部变量必须是final或effectively final。