14

与えられたdoSomething(Function foo) { println foo(2) }

グルーヴィー:doSomething( { it*it } as Function )

ジャワ:doSomething( (x) -> x*x )

両者に違いはありますか?

4

2 に答える 2

10

Groovy では、クロージャーは type のファースト クラスgroovy.lang.Closureシチズンですが、Java 8 のラムダは、それが表すデフォルト メソッド インターフェイスの実際のインスタンスです。

これは、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-17T08:00:28.670 に答える