Java8でカリー化
完全におもちゃです。
使いたくなる場面はないでしょう。
いきなり全コード↓
package sample; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; public class Main { /** 2引数関数のカリー化 */ static <T, U, R> Function<T, Function<U, R>> curried(BiFunction<T, U, R> biFunction) { return (t) -> (u) -> biFunction.apply(t, u); } /** 2つの引数の引き算 */ static int sub(int a, int b) { return a - b; } /** Optionalの便利な適用 */ static <A, B> Optional<B> apply(Optional<Function<A, B>> func, Optional<A> param) { return param.flatMap((p) -> func.map((f) -> f.apply(p))); } public static void main(String[] args) { Function<Integer, Function<Integer, Integer>> sub = curried(Main::sub); Optional<Integer> a = Optional.of(7); Optional<Integer> b = Optional.of(3); Optional<Integer> c = Optional.empty(); Optional<Integer> x = apply(apply(Optional.of(sub), a), b); Optional<Integer> y = apply(apply(Optional.of(sub), a), c); Optional<Integer> z = apply(apply(Optional.empty(), a), b); System.out.println(x); // => Optional[4] System.out.println(y); // => Optional.empty System.out.println(z); // => Optional.empty } }
う...変数初期化左辺の型推論欲しい。
curried
がカリー化する関数です。
2引数関数として標準ライブラリに用意されているBiFunction
を引数に取って、Function
を返すFunction
を返しています。
apply
は「Optionalの便利な適用」ができる関数です。
で、これを使ってOptional
な値を、素の引数を取るsub
に食わせてます。
以上