这是一份Java 8 Lambda的早期设计文档。 文档里Lambda的语法和最终的实现有一些细微的区别,但是不影响阅读。 最终的Lambda设计文档见这里。
Lambda也叫“闭包(closure)”。
在Java 8之前,anonymous inner class可以认为是一种闭包——它可以capture enclosing class里定义的变量,封装一段或者几段代码以便稍后执行。
anonymous inner classes的缺点是语法太啰嗦、this
不是lexically scoped、不能capture非final变量等。
Java 8引入Lambda是为了解决这些问题。
Java 8在引入Lambda时,并没有引入新的function type;而是借助SAM type来实现Lambda。 SAM(single abstract method) type是指只有一个抽象方法的接口。
Lambda expressions can only appear in context where it will be converted to a variable of SAM type.
Lambda表达式都会转化为一个SAM类型的变量。 凡是能接收SAM类型的地方,比如方法的参数,都可以接收一个Lambda表达式。
Comparator<String> c = (String s1, String s2) -> s1.compareToIgnoreCase(s2);
Java 8的Lambda表达式和anonymous inner class的一个不同之处是它们对this
的解读。
Lambda表达式中的this
指的是enclosing class中的this
。
anonymous inner class中的this
指的是inner class自己的this
。