読者です 読者をやめる 読者になる 読者になる

Groovy 1.8 のクロージャ合成

Groovy

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]