Given doSomething(Function foo) { println foo(2) }
Groovy: doSomething( { it*it } as Function )
Java: doSomething( (x) -> x*x )
Is there any difference between the two?
在 Groovy 中,闭包是 type 的一等公民groovy.lang.Closure
,而 Java 8 中的 lambda 是它们所代表的默认方法接口的实际实例。
这意味着您需要as
在 Groovy 中使用关键字(如您所示),但是在 Java 中您需要指定一个接口,因此在 Groovy 中,您可以这样做:
def adder( int i, Closure cl ) {
cl( i )
}
int v = adder( 2 ) { i ->
i + 8
}
assert v == 10
这在 Java 8 中变为:
public class Test {
interface MyAdder {
int call( int i ) ;
}
public int adder( int i, MyAdder adder ) {
return adder.call( i ) ;
}
public static void main( String[] args ) {
int v = new Test().adder( 2, (x) -> x + 8 ) ;
System.out.println( v ) ;
}
}
显然,您现在还可以在接口中声明默认实现,我没有在这里展示...
不确定这是否是所有差异,但至少是不同的;-)
{() -> new MyObject();}
可以写成MyObject::new
. 我认为并非所有 lambda 表达式都可以使用方法引用来表示。我认为将 Java 8 中的 lambda 表达式支持与更成熟的 Groovy 或 Scala 支持进行比较并不理想。这是 Java 引入 lambda 表达式的第一步,因此我们可以期待对 lambda 表达式有更成熟的支持。