Поиск…


Закрытие с явными параметрами

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow