groovy
Затворы
Поиск…
Закрытие с явными параметрами
def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8
Закрытие с неявными параметрами
['cat', 'dog', 'fish'].collect { it.length() }
it
имя параметра по умолчанию, если у вас есть один параметр и явным образом не указываю параметр. Вы также можете указать параметр.
['cat', 'dog', 'fish'].collect { animal -> animal.length() }
Преобразование методов в закрытие
Метод можно преобразовать в замыкание с помощью оператора & .
def add(def a, def b) { a + b }
Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)
Закрытие с настраиваемой целью для вызовов методов с неявным приемом
class MyHello {
def sayHello() {
"Hello, world"
}
}
def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException
cl.delegate = new MyHello()
cl(); // "Hello, world"
Широко используется Groovy DSL.
Обертывание по крышке методом
Существуют частые шаблоны поведения, которые могут привести к большому шаблону кода. Объявив метод, который принимает Closure
в качестве параметра, вы можете упростить свою программу. Например, для получения соединения с базой данных, запуска транзакции, выполнения работы, а затем либо фиксации транзакции, либо отката соединения (в случае ошибки), является общей схемой, а затем завершите соединение:
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 ...
}
Создание закрытий, назначение свойств и вызов
Давайте создадим карту и закрытие для печати приветствия
def exMap = [:]
def exClosure = {
println "Hello"
}
Назначить закрытие свойства на карте
exMap.closureProp = exClosure
Закрытие вызова
exMap.closureProp.call()
Выход
Hello
Другой пример. Позволяет создать класс с базовым свойством и назначить его закрытие для объекта
class Employee {
def prop
}
def employee = new Employee()
employee.prop = exClosure
Закрытие вызова через это свойство
employee.prop.call()
Выход
Hello