Lambda表达式(也称为闭包)把一个函数实现作为参数传递到具体代码逻辑中(行为即参数),Java通过参数类型来推断出具体实现意图,不需要写全参数类型信息,大大简化了代码量。
Lambda表达式简化了匿名内部类的写法,是Java函数式编程的一种体现。
以往的函数式编程写法:
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
Lambda写法:
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
Lambda特征:
1、参数类型声明可选:由编译器去统一识别;
2、参数圆括号声明:只有一个参数不需要圆括号,多个参数需要;
3、实现逻辑的大括号:如果只包含一条语句,则无需使用大括号;
4、实现逻辑中的return关键字:如果一条语句中直接返回,则无需return关键字。
Lambda表达式如何匹配到接口中对应函数:
1、接口中未实现的函数只有一个;(可以定义Object基类方法)
2、接口中未实现的函数的参数和Lambda表达式中参数一致(类型、数量、顺序完全一致);
3、接口中可以存在已实现的其他函数(Java8支持)。
实例验证一下:
public class OperatorTest {
public static final void main(String[] args) {
Operator addOper = (a, b) -> a + b;
Operator reduceOper = (a, b) -> a - b;
Operator multiplyOper = (a, b) -> a * b;
Operator DivideOper = (a, b) -> a / b;
OperatorTest test = new OperatorTest();
System.out.println(test.getResult(3, 3, addOper));
System.out.println(test.getResult(3, 3, reduceOper));
System.out.println(test.getResult(3, 3, multiplyOper));
System.out.println(test.getResult(3, 3, DivideOper));
}
public int getResult(int a, int b, Operator operator) {
return operator.convert(a, b);
}
public interface Operator {
int convert(int a, int b);
default int get(int a) {
return a;
}
// Object 基类方法可以有
boolean equals(Object obj);
String toString();
int hashCode();
}
}
如果Operator接口中还存在int set(int a); 这样未实现的方法,则Lambda表达式会编译报错:
Operator '+' cannot be applied to '<lambda parameter>', '<lambda parameter>'
因为编译器无法正常识别Lambda表达式实现的是接口中的哪个函数。