Groovy 1.8 から closure composition が使えるようになりました。というかまだBetaですが。
closure composition は << と >> を使います。
def plus2 = { it + 2 } def times3 = { it * 3 } def composed1 = plus2 << times3
composed1 は times3 の関数の結果を plus2 に適用する関数となります。
composed1 は以下のような結果となります。
composed1(3) // plus2(times3(3)) なので 11 composed1(4) // plus2(times3(4)) なので 14
関数を入れ替えると以下のようになります。
def composed2 = times3 << plus2 composed2(3) // times3(plus2(3)) なので 15 composed2(5) // times3(plus2(5)) なので 21
>> は順番が入れ替わるだけで同じように使えます。
def composed3 = times3 >> plus2 composed3(3) // plus2(times3(3)) なので 11 composed3(4) // plus2(times3(4)) なので 14
こんな感じです。
def twice = { a -> a * 2 } def inc = { b -> b + 1 } def f = inc >> twice // { x -> twice(inc(x)) } という関数と同義
testケースそのままですが、こんな感じで使ったり、
def s2c = { it.chars[0] } def p = Integer.&toHexString >> s2c >> Character.&toUpperCase assert p(15) == 'F'
こんな感じで使ったりできます。
def multiply = { a, b -> a * b } def identity = { a -> [a, a] } def sq = identity >> multiply assert (1..5).collect { sq(it) } == [1, 4, 9, 16, 25]