Java试图在最新版本中加入闭包的提议看起来不错,虽然有很多局限,目前最新的提议可在这里查看:State of the Lambda
新的提议主要是在语言层面添加lambda表达式来取代一个方法的接口生成的匿名内部类,使用类似Runnable,Comparable, Callable等接口在添加lambda表达式后不再需要创建一个匿名的内部类,使用新的语义使用Runnable时,代码可写为:
Runnable r = #{ System.out.println("Blah") }; Runnable r = (Runnable) #{ System.out.println("Blah") }; executor.submit( #{ System.out.println("Blah") } );
类似#{ Object o -> o}这样的表达式只能赋值给只有一个方法的接口(SAM, single abstract method),不能赋值给对象,并且接口的方法要和lambda表达式相匹配。
lambda表达式是匿名的函数类型,但是新的提议似乎不打算将其作为Java语言的一种新的类型,而是使用单方法的接口(SAM)来表示这种类型,这可能降低了复杂性!
lambda表达式另外一个有用的功能是能够将方法转换为一个SAM类型,要转换的方法应该和接口中的方法相对应,从提议中复制过来的这段代码:
class Person { private final String name; private final int age; public static int compareByAge(Person a, Person b) { ... } public static int compareByName(Person a, Person b) { ... } } Person[] people = ... Arrays.sort(people, #Person.compareByAge);这个功能确实很有用,可以将lambda表达式的调用和方法的实现分开!