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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow