很多语言都有lambda机制,我第一次见到Java的lambda用法是在写PriorityQueue的时候:
PriorityQueue<Integer> q = new PriorityQueue<Integer>((a,b)->(a-b));
这种写法比new comparator<>()
简洁太多了。
PriorityQueue<Integer> q = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int Compare(Integer o1,Integer o2){
return o1-o2;
}
});
在很久以前,逻辑学家Alonzo Church使用lambda(λ)来表示数学函数,λ的标记就是参数的意思。
Java中的lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。
- lambda表达式是由
参数 -> 表达式
构成。 - lambda表达式和很多接口,比如Comparator、ActionListener是兼容的。可以把lambda表达式看做一个函数,能够传递到函数式接口上。
- Java是一种强类型语言,我们计算
o1-o2
,还需要指定类型(Integer o1,Integer o2)->o1-o2
,这里也使用了Java的自动拆箱机制。在上面的例子中new PriorityQueue<Integer>((a,b)->(a-b));
,由于编译器可以推导出类型,所以省略了其类型。返回类型也是可以根据上下文推导的。 - lambda表达式的重点是延迟执行,有这几种情况
- 在一个单独的线程中运行代码;
- 多次运行代码;
- 在算法的适当位置运行代码;
- 发生某种情况时或必要时才运行代码。
——参考《Java核心技术·卷I》