给定doSomething(Function foo) { println foo(2) }
Groovy:doSomething( { it*it } as Function )
Java:doSomething( (x) -> x*x )
这两者有什么区别吗?
发布于 2013-09-17 08:00:28
在Groovy中,闭包是groovy.lang.Closure类型的头等公民,而Java8中的lambdas是它们表示的默认方法接口的实际实例。
这意味着您需要在Groovy中使用as关键字(如您所示),但在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 ) ;
}
}显然,您现在也可以在接口中声明默认实现,我在这里没有显示.
不确定这是不是所有的差异,但至少是不同的;-)
发布于 2013-09-25 08:48:16
{() -> new MyObject();}这样的lambda表达式,那么它可以编写为MyObject::new。我认为并非所有lambda表达式都可以使用方法引用来表示。我认为将Java 8中的lambda表达式支持与更成熟的Groovy或Scala支持进行比较并不理想。这是Java引入lambda表达式的第一步,因此我们可以期待对lambda表达式有更成熟的支持。
https://stackoverflow.com/questions/18842109
复制相似问题