给定doSomething(Function foo) { println foo(2) }
Groovy:doSomething( { it*it } as Function )
Java:doSomething( (x) -> x*x )
两者之间有什么区别吗?

最佳答案

在Groovy中,闭包是groovy.lang.Closure类型的一等公民,而Java 8中的lambda是它们表示的默认方法接口(interface)的实际实例。

这意味着您需要在Groovy中使用as关键字(如您所示),但是,在Java中,您需要指定一个接口(interface),因此在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 ) ;
    }
}

显然,您现在还可以在接口(interface)中声明默认实现,这里没有显示...

不知道这是否是所有差异,但至少是差异;-)

07-24 13:40