今回はシンタックスシュガーという意味だけのラムダのこと.
でもラムダは単なるシンタックスシュガーではないというはなしがあったので、その辺りは次回以降.
目次とぶっつぶつテーマ
http://snoopopo.hatenablog.com/entry/2015/04/14/102732
今日のテーマ:ラムダ式の基本 1
・関数型インタフェースの実装の記述の簡素化
・ラムダ式を使ったJava8での新機能(streamAPIとか?)
↑より引き続き、まずは記述が簡素になったことを取り上げてく.
ラムダ式の書き方
前回の復習から.
以下は匿名クラスでの書き方.
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