JavaのFunctionの合成はかなり便利

Java8から導入されたFunctionインターフェースはかなり便利な機能で多用している。特に関数合成が便利なので、ぜひ利用してほしい。

Functionインターフェース

define

Function<String, Integer> string2Integer = s -> Integer.valueOf(s);

Functionインターフェースではジェネリクスの1つめが引数、2つめが戻り値となっている
いつものJavaと比べるとちょっと変ですよね

use

s.apply("2");

これでOK。apply(引数)って感じで渡せばいいだけです。

他のパラメータも渡したい

これだと変数1個しか渡せなくて不便に感じる人もいるかとおもいます。変数宣言だと無理なのですが、メソッドとしてもFunctionインターフェース使えるのでこれを使うべしかなと思います。

define

Function<String, Integer> s(Integer param) {
    return s -> {
            return Integer.valueOf(s) + param;
        }
}

こんな感じになります。lambda式な感じになるので、違和感なく使えるかなと。メソッドの引数にパラメータを渡す感じです。

use

s(1).apply("2")

こんな感じで使います。 s(1) これでFunction<T,R>の戻り値を返却して、それをapplyする感じにしています。

合成

Functionは合成機能が標準であるので、これがとても便利です。
AやってBやってCやってみたいなのが、関数として組み合わせられて、状態依存もしにくいのでいいかなと。

define


Function<String, Integer> string2Integer = sVal -> Integer.valueOf(s); Function<String, Integer> sMethod(Integer param) { return s -> { return Integer.valueOf(s) + param; } }

先程の変数宣言とメソッド宣言を名前変えておきます。

use


sVal.andThen(sMethod(3)).apply("2")

こんな感じで使います。
andThenで関数と関数をくっつけます。(composeっていうのもあります)
実行順は andThencomposeで異なります。

andThenは A.andThen(B) だとすると A->Bの順
composeはA.compose(B)だとすると B->Aの順

で実行されます。

その他

関数合成ができてからとても便利になりました。
基本的に操作したい対象とパラメータはわけた方がよくて、パラメータ等はメソッドの引数で渡すのがいいと思います。
操作対象をFunctionインターフェースの方に渡すのがいいと思いました。