LoginSignup
8
6

More than 5 years have passed since last update.

ラムダ式というもの

Last updated at Posted at 2014-09-09

無名クラスがかなり書きやすくなりました

java7までの無名クラスはひたすら残念でした。swingなどのGUIライブラリにはよくありがちで、イベントハンドラを無名クラスで登録したりしますが、何ぶん意味のない記述が多すぎました。
ここに挨拶をするだけのインターフェイスとそれを使うメソッドがあります。

greet.java
interface Greeter {
    String hello();
}
void greet(Greeter g) {
  System.out.println(g.hello());
}

java7でこのgreetを使おうとするとこんな感じになります。

java7.java
greet(new Greeter() {
  @Override
  public String hello() {
    return "hello java7"
  }
});

うんざりです。本当に価値があるのはreturn "hello java7"だけです。これだけを書きたいのに6行も書かなくちゃいけません。けど、これがjava8になるとこうなります。

java8.java
greet(() -> {return "hello java8";});

これだけです。スッキリしすぎています。クラス自体は見えなくなり、処理が際立って見えるようになりました。こういう無名の処理をラムダ式と言ったりします。
ラムダ式の書式は以下の通りです。

mumei.java
(arg1, arg2 ...) -> {処理1; 処理2; ... }

引数リストを受け取って、右の本体で処理します。引数に対する型宣言は不要で、インターフェイスの定義通りに引数が渡されてきます。先の例のように引数が不要な場合、左っ側は()だけです。

かなり簡単に書けるように、また見やすくなった無名クラスですが、これを使うにはinterfaceに定義されているメソッドが1つだけの場合という制限があります。
しかしまぁ、こういった用途に使うinterfaceは大抵一つの仕事しかさせない(=メソッドは一つで十分)ので制限だと感じる事はまずないと思います。
もしメソッドがどうしても2つ必要な設計になるとしたら、それはクラスに対して責任過多になっちゃってる可能性があるので、interfaceを分離する事を検討したほうが良いかもしれません。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6