No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Groovyでクロージャを宣言する

動作確認:Groovy Version: 1.5.7 JVM: 1.6.0_10

使用例

インラインで宣言して使う

一番よくみるパターン。Groovyではメソッド引数の最後がClosure型の場合、省略系の構文が使えるので便利。

def result
result = [1, 2, 3].collect { it * 2 }
assert result == [2, 4, 6]
変数に参照を保持して使う

一旦変数に保持しておいてから、あとで使うパターン。*1

def clos = { it * 5 }
result = [1, 2, 3].collect(clos)
assert result == [5, 10, 15]
メソッドからクロージャとして抽出して使う

既存のメソッドをクロージャとして抽出して使うパターン。「.&」+メソッド名の形で取得できる。*2

インスタンスメソッド、スタティックメソッドの両方ともで使える。

class Hoge {
  /** instanceメソッド */
  def doSomethingI(x) { return x * 10 }
  /** staticメソッド */
  def static doSomethingS(x) { return x * 100 }
}

def hoge = new Hoge()
clos = hoge.&doSomethingI
result = [1, 2, 3].collect(clos)
assert result == [10, 20, 30]
result = [1, 2, 3].collect(Hoge.&doSomethingS)
assert result == [100, 200, 300]

*1:保持した後にカリー化して別のクロージャを作ったりもできる。

*2:ちなみに、「.&」はメソッドクロージャ演算子というらしい