Java SE 8 で関数合成

以前 に Groovy や Scala 等で実施した関数合成と同様の処理を Java 8 で試してみました。

  • Java SE 8 EA b102 (現時点の最新は b104 のようです)

サンプルソースは http://github.com/fits/try_samples/tree/master/blog/20130901/

andThen と compose

Java 8 では Scala と同様に andThen や compose メソッドを使います。 処理の実行にも apply メソッドを使いますが、Scala のようなメソッド名の省略はできません。

なお、andThen・compose メソッドは java.util.function.Function インターフェース等にデフォルト実装されています。

ComposeSample.java
import java.util.function.Function;

public class ComposeSample {
    public static void main(String... args) {
        Function<Integer, Integer> plus = (x) -> x + 3;
        Function<Integer, Integer> times = (x) -> x * 2;

        // (4 + 3) * 2 = 14 : plus -> times
        System.out.println(plus.andThen(times).apply(4));
        // (4 * 2) + 3 = 11 : times -> plus
        System.out.println(plus.compose(times).apply(4));
    }
}

今回のような用途には Function<Integer, Integer> の代わりに IntFunction を使いたいところですが、今のところ IntFunction は Function を extends しておらず andThen・compose メソッドは使えないようです。

実行結果
> java ComposeSample
14
11