サーチ…


明示的なパラメータによる終了

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