みなさん、こんにちは。品質管理部の平良です。
9/18〜9/22にサンフランシスコで開かれているJavaOneに参加しておりますので、この期間中は現地レポートをお届けします。
JavaOneでは数あるセッションの中から、自分の気になるものを選択して講演を聞きます。セッションの中には「Java Keynote」といった基調講演もあり、このセッションには参加者のほぼ全員が一堂に会します。
今年のJava Keynoteでは次のようなことが披露されていました。
・JDKをDockerに対応させる予定
・JavaEEのロードマップ(2017:EE8, 2018:EE9)
・JShellのデモ
・型推論の強化
・企業の活用事例(日本からはマツダ、富士通、日立、NEC、損保ジャパン日本興亜)
また本イベントでは食事が提供されたりバンド演奏が開かれたりと、セッション以外の楽しみもあります。
さて、1日目に参加したセッションの中で印象に残ったトピックを紹介します。
「カリー化」という言葉を耳にしたことはありますでしょうか。
複数の引数を取るような関数を、引数の数を少なくする代わりに残りの引数を取るような関数を返却する手法です。
言葉だけだと分かりづらいので例を見てみましょう。
public class Curring { public static void main(String[] args) { System.out.println(converter(15, 9.0 / 5, 32)); // 59.0 DoubleUnaryOperator convertCtoF = curriedConverter(9.0 / 5, 32); System.out.println(convertCtoF.applyAsDouble(15)); // 59.0 } static double converter(double x, double f, double b) { return x * f + b; } static DoubleUnaryOperator curriedConverter(double f, double b) { return x -> x * f + b; } }
Java8から導入されたラムダ式によってより簡単にカリー化を記述できるようになりました。
カリー化することのメリットとして部分適用がしやすくなることが挙げられます。 また例を見てみましょう。
public class Curring2 { public static void main(String[] args) { double[] bodyTemperatures = {36.4, 38.2, 35.8, 33.5, 39.0, 42.2}; Function<Double, Function<Double, Double>> min35 = curriedRange().apply(35.0); Function<Double, Double> min35max37 = min35.apply(37.0); Arrays.stream(bodyTemperatures) .map(min35max37::apply) .forEach(System.out::println); // 36.4 37.0 35.8 35.0 37.0 37.0 Function<Double, Double> min35max40 = min35.apply(40.0); Arrays.stream(bodyTemperatures) .map(min35max40::apply) .forEach(System.out::println); // 36.4 38.2 35.8 35.0 39.0 40.0 } static Function<Double, Function<Double, Function<Double, Double>>> curriedRange() { return x -> y -> z -> Math.max(x, Math.min(y, z)); } }
min35max37は、引数に取った数が35.0〜37.0の間になるように下限上限を設けるような関数です。min35max40は、同じように35.0〜40.0の間になるようにする関数です。 上の例の場合、min35が部分適用になります。
部分適用された関数を2回使いまわすことで記述がスッキリします。取るべき引数も各関数で1個だけなので分かりやすいですね。
ぜひ使いこなしていきましょう。