Java Closures

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表达式的调用和方法的实现分开!



你可能感兴趣的:(Java Closures)