groovy
sluitingen
Zoeken…
Sluiting met expliciete parameters
def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8
Sluiting met impliciete parameters
['cat', 'dog', 'fish'].collect { it.length() }
it
is de standaardnaam van de parameter als u een enkele parameter hebt en de parameter niet expliciet een naam geeft. U kunt desgewenst ook de parameter declareren.
['cat', 'dog', 'fish'].collect { animal -> animal.length() }
Methoden omzetten naar sluitingen
Een methode kan worden omgezet in een sluiting met de operator & .
def add(def a, def b) { a + b }
Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)
Sluiting met aangepast doel voor methodeaanroepen met impliciete ontvanger
class MyHello {
def sayHello() {
"Hello, world"
}
}
def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException
cl.delegate = new MyHello()
cl(); // "Hello, world"
Veelvuldig gebruikt door Groovy DSL's.
Wikkelgedrag rond een sluiting met een methode
Er zijn veel voorkomende gedragspatronen die kunnen resulteren in veel boilerplate-code. Door een methode te declareren die Closure
als parameter neemt, kunt u uw programma vereenvoudigen. Het is bijvoorbeeld een gebruikelijk patroon om een databaseverbinding op te halen, een transactie te starten, te werken en vervolgens de transactie te plegen of de verbinding terug te draaien (in geval van een fout) en vervolgens de verbinding te sluiten:
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 ...
}
Maak sluitingen, wijs eigenschappen toe en roep aan
Laten we een kaart en een sluiting maken om hallo af te drukken
def exMap = [:]
def exClosure = {
println "Hello"
}
Wijs sluiting toe aan een woning op de kaart
exMap.closureProp = exClosure
Oproep afsluiten
exMap.closureProp.call()
uitgang
Hello
Een ander voorbeeld - Laten we een klasse met basiseigenschap maken en dezelfde afsluiting toewijzen als object ervan
class Employee {
def prop
}
def employee = new Employee()
employee.prop = exClosure
Oproepafsluiting via die eigenschap
employee.prop.call()
uitgang
Hello