groovy
Cierres
Buscar..
Cierre con parámetros explícitos.
def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8
Cierre con parámetros implícitos.
['cat', 'dog', 'fish'].collect { it.length() }
it
es el nombre por defecto del parámetro si tiene un solo parámetro y no nombra explícitamente el parámetro. Opcionalmente puede declarar el parámetro también.
['cat', 'dog', 'fish'].collect { animal -> animal.length() }
Convertir métodos a cierres
Un método se puede convertir en un cierre utilizando el operador & .
def add(def a, def b) { a + b }
Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)
Cierre con destino personalizado para llamadas de método con receptor implícito
class MyHello {
def sayHello() {
"Hello, world"
}
}
def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException
cl.delegate = new MyHello()
cl(); // "Hello, world"
Utilizado extensivamente por Groovy DSLs.
Envolviendo el comportamiento alrededor de un cierre con un método.
Hay patrones de comportamiento frecuentes que pueden resultar en una gran cantidad de código repetitivo. Al declarar un método que toma un Closure
como parámetro, puede simplificar su programa. Como ejemplo, es un patrón común recuperar una conexión de base de datos, iniciar una transacción, hacer un trabajo y luego confirmar la transacción, o revertir la conexión (en caso de error), y finalmente cerrar la conexión:
def withConnection( String url, String user, String pass, Closure closure) {
Connection conn = null
try {
conn = DriverManager.getConnection( url, user, pass )
closure.call( conn )
conn.commit()
} catch (Exception e) {
log.error( "DB Action failed", e)
conn.rollback()
} finally {
conn?.close()
}
}
withConnection( DB_PATH, DB_USER, DB_PASS ) { Connection conn ->
def statement = conn.createStatement()
def results = statement.executeQuery( 'SELECT * FROM users' )
// ... more processing ...
}
Crear cierres, asignar propiedades y llamar.
Vamos a crear un mapa y un cierre para imprimir hola.
def exMap = [:]
def exClosure = {
println "Hello"
}
Asignar cierre a una propiedad en mapa
exMap.closureProp = exClosure
Cierre de llamadas
exMap.closureProp.call()
Salida
Hello
Otro ejemplo: permite crear una clase con propiedad básica y asignar el mismo cierre al objeto de la misma.
class Employee {
def prop
}
def employee = new Employee()
employee.prop = exClosure
Cierre de llamadas a través de esa propiedad.
employee.prop.call()
Salida
Hello