这是一份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