¿Es posible tener una lista y usarla como argumento para una firma de cierre que en cambio tenga varias variables? La razón es que tengo que llamar a un cierre desde el código java, y el código java no sabrá qué variables necesita el cierre maravilloso.Groovy: lista de expansión en argumentos de cierre
Esto se mejora con un ejemplo.
Digamos que tengo un 'repositorio de cierre', donde cada cierre puede tener diferentes firmas. EG:
closures = [
closureA: { int a, String b ->
a.times {
System.err.println(b);
}
},
closureB: { int a, int b, String c ->
(a+b).times {
System.err.println(c);
}
}
]
Entonces tengo un método que estoy exponiendo a mi código Java para llamar a estos cierres:
def tryClosureExpansion(String whichClosure, Object ... args) {
def c = closures[whichClosure]
c.call(args) // DOESNT COMPILE !
}
Java Y me gustaría llamar a este método como este:
// these calls will happen from Java, not from Groovy
tryClosureExpansion("closureA", 1, "Hello");
tryClosureExpansion("closureB", 1, 5, "Hello more");
Consulte arriba en la línea que no se compila. Siento que groovy es lo suficientemente "groovy" como para manejar algo como esto. ¿Alguna alternativa que pueda volar?
Debería funcionar. Además, solo usar la sintaxis de llamada del método debería funcionar también: 'c (* args)'; pero puede aprovechar el método 'call' y usar el operador de navegación segura en caso de que el cierre no exista:' c? .call (* args) '(por supuesto, esto depende de su diseño, quizás lanzando una excepción en ese caso puede ser una mejor idea). – epidemian
Gracias Tim, eso fue todo. Me pregunto dónde está documentado esto. Revisé las páginas de Operadores y Colecciones, y mencionan el operador de difusión, pero esto es un poco diferente ya que no especifica una acción en la lista. @epidemian - gracias, de hecho voy a verificar esta llamada y lanzar una excepción. –
@RoyTruelove Se llama 'Operador de extensión'. Se usa para aplicar algo a varias entradas en una colección, o en este caso ampliar la lista [en múltiples parámetros] (http://jroller.com/aalmiray/entry/another_gem_from_groovy) –