Szukaj…


Zamknięcie z wyraźnymi parametrami

def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8

Zamknięcie z niejawnymi parametrami

['cat', 'dog', 'fish'].collect { it.length() }

it jest domyślna nazwa parametru, jeśli masz jeden parametr, a nie jawnie nazwę parametru. Opcjonalnie możesz również zadeklarować parametr.

['cat', 'dog', 'fish'].collect { animal -> animal.length() }

Konwertowanie metod na zamknięcia

Metodę można przekształcić w zamknięcie za pomocą operatora & .

def add(def a, def b) { a + b }    

Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)

Zamknięcie z niestandardowym celem dla wywołań metod z niejawnym odbiornikiem

class MyHello {
  def sayHello() {
    "Hello, world"
  }
}

def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException    
cl.delegate = new MyHello()
cl(); // "Hello, world"

Używany szeroko przez Groovy DSL.

Sposób owijania wokół zamknięcia metodą

Istnieją częste wzorce zachowań, które mogą powodować powstanie dużej ilości kodu typu „płyta podstawowa”. Deklarując metodę, która przyjmuje jako parametr Closure , możesz uprościć swój program. Na przykład, powszechnym wzorcem jest pobieranie połączenia z bazą danych, rozpoczęcie transakcji, wykonanie pracy, a następnie zatwierdzenie transakcji lub wycofanie połączenia (w przypadku błędu), a następnie zakończenie połączenia:

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 ...
}

Utwórz zamknięcia, przypisz do właściwości i zadzwoń

Stwórzmy mapę i zamknij, aby wydrukować cześć

def exMap = [:]

def exClosure = {
    println "Hello"
}

Przypisz zamknięcie do właściwości na mapie

exMap.closureProp = exClosure

Zamknięcie połączenia

exMap.closureProp.call()

Wynik

Hello

Kolejny przykład - Stwórzmy klasę z podstawową właściwością i przypiszmy jej zamknięcie do jej obiektu

class Employee {
    def prop
}

def employee = new Employee()

employee.prop = exClosure

Zamknięcie połączenia za pośrednictwem tej właściwości

employee.prop.call()

Wynik

Hello


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow