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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow