수색…


명시 적 매개 변수로 종료

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

클로저 생성, 속성 할당 및 호출

hello를 인쇄하기 위해지도와 클로저를 만들어 보겠습니다.

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