Javaによる関数型プログラミング ―Java 8ラムダ式とStream
- 作者: Venkat Subramaniam,株式会社プログラミングシステム社
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
ラムダ式を使うと、Javaプログラムがこんな感じに関数型っぽく書けるよ!という本です。ストリーム処理、継承から委譲への置き換え、処理の遅延、末尾呼び出し最適化のシミュレーション、例外発生のテストなど。最後の点については、次のようなアサーションが書ける仕組みを紹介しています。
// doSomethingStrange()はランタイム例外を発生する assertThrows(RuntimeException.class, () -> { doSomethingStrange(); });
構文や標準APIについては簡単にまとめられているだけなので、ラムダ式や他の言語の無名関数に触れたことがない人には、少し難しいかもしれません。ラムダ式の基本的な使い方を把握した上で、関数型っぽい書き方を知りたい人向けの本だと思います。
ただ何点か、用語に疑問を感じるところがありました。たとえば8.1節のタイトルは「関数合成の利用 (Using Function Composition)」となっていますが、説明されているのは関数合成ではなく「メソッドチェーン」です。それから、p. 75, 3.7 「flatMapで直下のサブディレクトリをリスト」。
public static void betterWay() { List<File> files = Stream.of(new File(".").listFiles()) .flatmap(file -> file.listFiles() == null ? Stream.of(file) : Stream.of(file.listFiles())) .collect(toList()); System.out.println("Count: " + files.size()); }(略)
flatMap()はとても多くの作業を削減しました。2つの処理をうまく組み合わせて、1つのエレガントなステップに変換しました。これはモナド合成 (monadic composition)と呼ばれます。
条件分岐と要素の追加を1つの式に畳み込んでいるだけであって、モナド合成ではないよね、という気がします。