ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

JavaのFunction<T,R>の合成はかなり便利

本家はこちら

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インターフェースの方に渡すのがいいと思いました。