En Groovy Closures - Formal Definition se acaba de llamar "Pasando los cierres a los métodos".
Groovy tiene un caso especial para definir cierres como argumentos de método para facilitar la lectura de la sintaxis de cierre. Específicamente, si el último argumento de un método es de tipo Cierre, puede invocar el método con un bloque de cierre explícito fuera del paréntesis. Por ejemplo, si una clase tiene un método:
class SomeCollection {
public void each (Closure c)
}
entonces puede invocar cada uno() con una definición de cierre fuera del paréntesis:
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
La sintaxis más tradicional también está disponible, y también Cabe destacar que en Groovy se puede eludir paréntesis en muchas situaciones, por lo que estas dos variaciones también son legales:
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ({ println it }) // Strictly traditional
la misma regla se aplica incluso si el método tiene otros argumentos. La única restricción es que el argumento de cierre debe ser el último:
class SomeCollection {
public void inject (x, Closure c)
}
stuff.inject(0) { count, item -> count + item } // Groovy
stuff.inject(0, { count, item -> count + item }) // Traditional
que pueden no ser relevantes para la "cuestión maravilloso", pero por ejemplo en Scala, esta "forma" es un caso especial de función 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
¿Qué opinas sobre [@mgryszko answer] (http://stackoverflow.com/a/10093625/462015) –
@Arturo: pensé que el método de la plantilla implica necesariamente herencia, donde la estrategia era una alternativa a ella, no una forma de ello. http://tech.puredanger.com/2007/07/03/pattern-hate-template/ –
¿Qué opina de [mi propia respuesta] (http://stackoverflow.com/a/10306434/462015)? –