groovy
Verschlüsse
Suche…
Schließung mit expliziten Parametern
def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8
Schließung mit impliziten Parametern
['cat', 'dog', 'fish'].collect { it.length() }
it
ist der Standardname des Parameters, wenn Sie einen einzelnen Parameter haben und den Parameter nicht explizit benennen. Optional können Sie den Parameter auch deklarieren.
['cat', 'dog', 'fish'].collect { animal -> animal.length() }
Methoden in Schließungen umwandeln
Eine Methode kann mit dem Operator & in eine Schließung konvertiert werden.
def add(def a, def b) { a + b }
Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)
Schließung mit benutzerdefiniertem Ziel für Methodenaufrufe mit implizitem Empfänger
class MyHello {
def sayHello() {
"Hello, world"
}
}
def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException
cl.delegate = new MyHello()
cl(); // "Hello, world"
Von Groovy DSLs ausgiebig genutzt.
Verhalten um einen Verschluss mit einer Methode wickeln
Es gibt häufige Verhaltensmuster, die zu vielen Boilerplate-Codes führen können. Durch die Deklaration einer Methode, die einen Closure
als Parameter verwendet, können Sie Ihr Programm vereinfachen. Es ist zum Beispiel ein allgemeines Muster, eine Datenbankverbindung abzurufen, eine Transaktion zu starten, zu arbeiten und dann entweder die Transaktion festzuschreiben oder die Verbindung (im Fehlerfall) zurückzusetzen und dann die Verbindung zu schließen:
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 ...
}
Schließungen erstellen, Eigenschaften zuweisen und aufrufen
Erstellen Sie eine Karte und einen Abschluss, um Hallo zu drucken
def exMap = [:]
def exClosure = {
println "Hello"
}
Weisen Sie einer Eigenschaft in der Karte den Abschluss zu
exMap.closureProp = exClosure
Schließung aufrufen
exMap.closureProp.call()
Ausgabe
Hello
Anderes Beispiel - Lässt eine Klasse mit grundlegenden Eigenschaften erstellen und demselben Objekt denselben Abschluss zuweisen
class Employee {
def prop
}
def employee = new Employee()
employee.prop = exClosure
Rufen Sie die Schließung über diese Eigenschaft auf
employee.prop.call()
Ausgabe
Hello