見出し画像

Effective Java(3rd) Item42.1 Prefer lambdas to anonymous classes

Java8では、関数オブジェクトを生成しやすいように、関数型インタフェース、ラムダ式、メソッド参照が加えられた。Stream APIは、連続するデータ要素を処理するライブラリのサポートを提供するために、これらの言語の変化と併せて加えられた。この章では、これらの機能の一番うまい使い方について議論する。

歴史的に、単一の抽象メソッドを持ったインタフェース(ごくたまに、抽象クラス)は関数型として使われていた。関数オブジェクトとして知られる、これらのインスタンスは関数やactionsを表す。JDK1.1が1997年にリリースされた時、関数オブジェクトを生成する主要手段は匿名クラス(anonymous class)だった(Item24)。ここに、文字列リストを長さ順に並び替えるコードの断片がある。ここでは、ソートの比較関数(並び順を課す)を生成するために匿名クラスが使われている。

匿名クラスは関数型オブジェクトを要請する、古典的なオブジェクト指向のデザインパターン、特にStrategyパターンには適切であった。Comparatorインタフェースはソートの抽象Strategyを表している。また、上の匿名クラスはソートの具体Strategyである。しかし、匿名クラスの冗長性によりJavaの関数型プログラミングは魅力的でないと思われた。

Java8では、Javaは単一の抽象メソッドを持ったインタフェースは特別扱いする必要があるとの考えに至った。これらのインタフェースは今では関数型インタフェースとして知られている。そしてJavaでは、これらのインタフェースのインスタンスをラムダ式、あるいは略してラムダを使って生成することが許されている。ラムダは匿名クラスに対する関数に似ているが、よりずっと簡潔である。ここで、上のコードをラムダを使って表すとどうなるか見てみよう。ポイラープレートはなくなり、振る舞いがわかりやすくなる。

ボイラープレートコード (英: boilerplate code、または単にボイラープレート) は、コンピュータプログラミングでは、殆ど、または全く変化することなく、複数の場所で繰り返される定型コードのセクションのこと。
Weblio

ここで、ラムダの型(Comparator<String>)と引数(s1とs2と、Stringも)、そして戻り値(int)がコードから消えていることに注意したい。コンパイラは型推論と呼ばれる手法を使って、文脈から型を推測する。コンパイラが型を決定できず、あなたが明示しなければならない場合もある。型推論のルールは複雑である。

この記事が気に入ったらサポートをしてみませんか?