Ricerca…


Chiusura con parametri espliciti

def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8

Chiusura con parametri impliciti

['cat', 'dog', 'fish'].collect { it.length() }

it è il nome predefinito del parametro se si dispone di un singolo parametro e non chiami in modo esplicito il parametro. Puoi anche dichiarare il parametro facoltativamente.

['cat', 'dog', 'fish'].collect { animal -> animal.length() }

Conversione dei metodi in chiusure

Un metodo può essere convertito in una chiusura usando l'operatore & .

def add(def a, def b) { a + b }    

Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)

Chiusura con target personalizzato per chiamate di metodo con ricevitore implicito

class MyHello {
  def sayHello() {
    "Hello, world"
  }
}

def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException    
cl.delegate = new MyHello()
cl(); // "Hello, world"

Utilizzato estesamente da Groovy DSL.

Avvolgimento del comportamento attorno a una chiusura con un metodo

Ci sono schemi comportamentali frequenti che possono comportare un sacco di codice boilerplate. Dichiarando un metodo che accetta una Closure come parametro, è possibile semplificare il programma. Ad esempio, è uno schema comune per recuperare una connessione al database, avviare una transazione, eseguire il lavoro, quindi eseguire il commit della transazione o eseguire il rollback della connessione (in caso di errore), quindi chiudere la connessione:

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 ...
}

Crea chiusure, assegna a proprietà e chiama

Creiamo una mappa e una chiusura per stampare ciao

def exMap = [:]

def exClosure = {
    println "Hello"
}

Assegna chiusura a una proprietà sulla mappa

exMap.closureProp = exClosure

Chiamare la chiusura

exMap.closureProp.call()

Produzione

Hello

Un altro esempio: consente di creare una classe con proprietà di base e assegnare la stessa chiusura a un oggetto

class Employee {
    def prop
}

def employee = new Employee()

employee.prop = exClosure

Chiama la chiusura attraverso quella proprietà

employee.prop.call()

Produzione

Hello


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow