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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow