groovy
Domknięcia
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