Groovyのクロージャ-正式な定義では、単に「クロージャをメソッドに渡す」と呼ばれています。
Groovyには、クロージャ構文を読みやすくするために、メソッド引数としてクロージャを定義するための特別なケースがあります。具体的には、メソッドの最後の引数がClosure型の場合、括弧の外側に明示的なクロージャブロックを指定してメソッドを呼び出すことができます。たとえば、クラスにメソッドがある場合:
class SomeCollection {
public void each ( Closure c )
}
次に、括弧の外にあるクロージャー定義を使用してeach()を呼び出すことができます。
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
より伝統的な構文も利用可能であり、Groovyでは多くの状況で括弧を削除できるため、これら2つのバリエーションも合法であることに注意してください。
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ( { println it } ) // Strictly traditional
メソッドに他の引数がある場合でも、同じルールが適用されます。唯一の制限は、Closure引数が最後でなければならないということです。
class SomeCollection {
public void inject ( x, Closure c )
}
stuff.inject( 0 ) { count, item -> count + item } // Groovy
stuff.inject( 0, { count, item -> count + item } ) // Traditional
これは「Groovyの質問」とは関係がないかもしれませんが、たとえばScalaでは、この「フォーム」は関数カリー化の特殊なケースです。
scala> def fun[A, B](a: A)(b: B) = {true}
fun: [A, B](a: A)(b: B)Boolean
scala> fun(1){2}
res59: Boolean = true