与えられたdoSomething(Function foo) { println foo(2) }
グルーヴィー:doSomething( { it*it } as Function )
ジャワ:doSomething( (x) -> x*x )
両者に違いはありますか?
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 ) ;
}
}
明らかに、インターフェイスでデフォルトの実装を宣言することもできますが、ここでは示していません...
これがすべての違いかどうかはわかりませんが、少なくとも違いはあります ;-)