無名クラスがかなり書きやすくなりました
java7までの無名クラスはひたすら残念でした。swingなどのGUIライブラリにはよくありがちで、イベントハンドラを無名クラスで登録したりしますが、何ぶん意味のない記述が多すぎました。
ここに挨拶をするだけのインターフェイスとそれを使うメソッドがあります。
interface Greeter {
String hello();
}
void greet(Greeter g) {
System.out.println(g.hello());
}
java7でこのgreetを使おうとするとこんな感じになります。
greet(new Greeter() {
@Override
public String hello() {
return "hello java7"
}
});
うんざりです。本当に価値があるのはreturn "hello java7"
だけです。これだけを書きたいのに6行も書かなくちゃいけません。けど、これがjava8になるとこうなります。
greet(() -> {return "hello java8";});
これだけです。スッキリしすぎています。クラス自体は見えなくなり、処理が際立って見えるようになりました。こういう無名の処理をラムダ式と言ったりします。
ラムダ式の書式は以下の通りです。
(arg1, arg2 ...) -> {処理1; 処理2; ... }
引数リストを受け取って、右の本体で処理します。引数に対する型宣言は不要で、インターフェイスの定義通りに引数が渡されてきます。先の例のように引数が不要な場合、左っ側は()
だけです。
かなり簡単に書けるように、また見やすくなった無名クラスですが、これを使うにはinterfaceに定義されているメソッドが1つだけの場合という制限があります。
しかしまぁ、こういった用途に使うinterfaceは大抵一つの仕事しかさせない(=メソッドは一つで十分)ので制限だと感じる事はまずないと思います。
もしメソッドがどうしても2つ必要な設計になるとしたら、それはクラスに対して責任過多になっちゃってる可能性があるので、interfaceを分離する事を検討したほうが良いかもしれません。