groovy
nedläggningar
Sök…
Stängning med uttryckliga parametrar
def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8
Stängning med implicita parametrar
['cat', 'dog', 'fish'].collect { it.length() }
it
är standardnamnet på parametern om du har en enda parameter och inte uttryckligen namnger parametern. Du kan valfritt också deklarera parametern.
['cat', 'dog', 'fish'].collect { animal -> animal.length() }
Konvertera metoder till stängningar
En metod kan konverteras till en nedläggning med & operatören.
def add(def a, def b) { a + b }
Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)
Stängning med anpassat mål för metodsamtal med implicit mottagare
class MyHello {
def sayHello() {
"Hello, world"
}
}
def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException
cl.delegate = new MyHello()
cl(); // "Hello, world"
Används mycket av Groovy DSL: er.
Inpackning beteende runt en stängning med en metod
Det finns ofta beteendemönster som kan resultera i mycket pannplattkod. Genom att förklara en metod som tar en Closure
som en parameter, kan du förenkla ditt program. Som ett exempel är det ett vanligt mönster att hämta en databasanslutning, starta en transaktion, utföra arbete och sedan antingen begå transaktionen eller rulla tillbaka anslutningen (i händelse av fel) och sedan slutligen stänga anslutningen:
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 ...
}
Skapa stängningar, tilldela egenskaper och ring
Låt oss skapa en karta och en stängning för att skriva ut hej
def exMap = [:]
def exClosure = {
println "Hello"
}
Tilldela stängning till en fastighet på kartan
exMap.closureProp = exClosure
Samtalstängning
exMap.closureProp.call()
Produktion
Hello
Ett annat exempel - Låter skapa en klass med grundegenskaper och tilldela samma stängning till objektet för den
class Employee {
def prop
}
def employee = new Employee()
employee.prop = exClosure
Samtalstängning genom den egenskapen
employee.prop.call()
Produktion
Hello