サーチ…
明示的なパラメータによる終了
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