In Groovys Closures - Formal Definition ist es nur "Passing Closures zu Methoden".
Groovy hat einen Sonderfall für Verschlüsse als Methodenargumente Festlegung der Verschluss Syntax leichter lesbar zu machen. Insbesondere dann, wenn das letzte Argument einer Methode vom Typ Closure ist, können Sie das Verfahren mit einem expliziten Verschlussblock außerhalb der Klammer aufzurufen. Zum Beispiel, wenn eine Klasse eine Methode hat:
class SomeCollection {
public void each (Closure c)
}
Dann können Sie each() mit einer Verschluss Definition außerhalb der Klammer aufzurufen:
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
Die traditionelle Syntax ist ebenfalls verfügbar, und auch beachten Sie, dass Sie in Groovy Klammer in vielen Situationen elide können, so dass diese beiden Varianten sind auch legal:
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ({ println it }) // Strictly traditional
die gleiche Regel gilt auch dann, wenn das Verfahren andere Argumente hat. Die einzige Einschränkung ist, dass die Schließung Argument letzten Mal gewesen sein muss:
class SomeCollection {
public void inject (x, Closure c)
}
stuff.inject(0) { count, item -> count + item } // Groovy
stuff.inject(0, { count, item -> count + item }) // Traditional
, die nicht die „Groovy Frage“ relevant sein können, aber zum Beispiel in Scala, diese „Form“ ist ein Sonderfall von Funktion currying:
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
Was denkst du über [@mgryszko antwort] (http://stackoverflow.com/a/10093625/462015) –
@ Arturo: Ich hatte gedacht, Vorlage-Methode wie notwendig Vererbung, wo Strategie eine Alternative dazu war, nicht eine Form davon. http://tech.puredanger.com/2007/07/03/pattern-hate-template/ –
Was denkst du über [meine eigene Antwort] (http://stackoverflow.com/a/10306434/462015)? –