本家はこちら
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っていうのもあります)
実行順は andThen
と compose
で異なります。
andThen
は A.andThen(B) だとすると A->Bの順
compose
はA.compose(B)だとすると B->Aの順
で実行されます。
その他
関数合成ができてからとても便利になりました。 基本的に操作したい対象とパラメータはわけた方がよくて、パラメータ等はメソッドの引数で渡すのがいいと思います。 操作対象をFunctionインターフェースの方に渡すのがいいと思いました。