Javaによる関数型プログラミング

Javaによる関数型プログラミング ―Java 8ラムダ式とStream

Javaによる関数型プログラミング ―Java 8ラムダ式とStream

ラムダ式を使うと、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つの式に畳み込んでいるだけであって、モナド合成ではないよね、という気がします。