今日のjavaおっかけ(20150426):ラムダ式 3

今回はシンタックスシュガーという意味だけのラムダのこと.

でもラムダは単なるシンタックスシュガーではないというはなしがあったので、その辺りは次回以降.

目次とぶっつぶつテーマ

http://snoopopo.hatenablog.com/entry/2015/04/14/102732

今日のテーマ:ラムダ式の基本 1

・関数型インタフェースの実装の記述の簡素化

ラムダ式を使ったJava8での新機能(streamAPIとか?)

( http://snoopopo.hatenablog.com/entry/2015/04/17/115424 )

↑より引き続き、まずは記述が簡素になったことを取り上げてく.

ラムダ式の書き方

前回の復習から.

以下は匿名クラスでの書き方.

Runnable runner = new Runnable(){

@Override
public void run() {
    System.out.println("tokumei class!!");

    }
};
runner.run();

これをラムダで書くと…

Runnable runner = () -> {
    System.out.println("lambda");
};
runner.run();

上のようになる。

java.lang.Runnableは関数型インターフェースで、run()という単一のメソッドしかない.

そのため、どのメソッドをオーバーライドするということをわざわざ書かなくてもrunをオーバーライド(というか実装か)したことになる.

引数を受け取るメソッドの場合

FuncInterfaceArgsSampleは java.lang.String の引数を受け取るメソッドを持ったインタフェースです.

引数ありメソッドの場合は以下のようになる.

FuncInterfaceArgsSample hoge = (String str) -> {
    System.out.println(str);
};
hoge.run("hoge");

関数型インターフェースの強制 FunctionalInterfaceアノテーション

ラムダを使うなら、関数型インタフェースでないといけない.

そこで、 FunctionalInterface アノテーションを使って、関数型インタフェースでないならコンパイルエラーをおこすことが出来る.

つまりこのアノテーション書いてたら関数型インタフェースであることをコンパイルの時点で保証してくれるわけだね.

先程適当に作った、インタフェースを例にする

@FunctionalInterface
public interface FuncInterfaceArgsSample {
    public abstract void run(String str);
}

メソッドを2つ定義したりすると、以下のようなコンパイルエラーになった.

Invalid '@FunctionalInterface' annotation; FuncInterfaceArgsSample is not a functional interface