groovy
Fermetures
Recherche…
Fermeture avec paramètres explicites
def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8
Fermeture avec des paramètres implicites
['cat', 'dog', 'fish'].collect { it.length() }
it
le nom par défaut du paramètre si vous avez un seul paramètre et ne nommez pas explicitement le paramètre. Vous pouvez également déclarer le paramètre en option.
['cat', 'dog', 'fish'].collect { animal -> animal.length() }
Conversion de méthodes en fermetures
Une méthode peut être convertie en une fermeture à l'aide de l'opérateur & .
def add(def a, def b) { a + b }
Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)
Fermeture avec une cible personnalisée pour les appels de méthode avec récepteur implicite
class MyHello {
def sayHello() {
"Hello, world"
}
}
def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException
cl.delegate = new MyHello()
cl(); // "Hello, world"
Très utilisé par les DSL Groovy.
Comportement d'emballage autour d'une fermeture avec un procédé
Il existe des comportements fréquents qui peuvent entraîner beaucoup de code passe-partout. En déclarant une méthode qui prend une Closure
en paramètre, vous pouvez simplifier votre programme. Par exemple, il est courant de récupérer une connexion à une base de données, de lancer une transaction, de travailler, puis de valider la transaction ou de restaurer la connexion (en cas d'erreur), puis de fermer la connexion:
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 ...
}
Créer des fermetures, attribuer des propriétés et appeler
Créons une carte et une fermeture pour imprimer Bonjour
def exMap = [:]
def exClosure = {
println "Hello"
}
Attribuer une fermeture à une propriété sur la carte
exMap.closureProp = exClosure
Fermeture d'appel
exMap.closureProp.call()
Sortie
Hello
Un autre exemple - Permet de créer une classe avec une propriété de base et d'affecter la même fermeture à l'objet de celle-ci
class Employee {
def prop
}
def employee = new Employee()
employee.prop = exClosure
Fermeture d'appel via cette propriété
employee.prop.call()
Sortie
Hello