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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow