ラムダ式の利用を対策する
前記事にて関数型インタフェースについて、実際のコードを交えて理解する記事を書いた。しかし、初学者にとっては見慣れないコードになっていたのではないだろうか。その見慣れない形こそラムダ式である。
public class Main { public static void main(String[] args) { Consumer<String> s = (String str) -> System.out.println(str); s.accept("test"); } }
実行結果
test
Consumerというのは既に用意されているインタフェースであり、implementsによる実装が必要になる。しかし、利用される範囲が限られており、「ここでしか使わない」という場合には実装をオブジェクト生成時と同時に行うことができる。これはいわゆる匿名クラスの説明だ。その匿名クラスの特別な書き方のことをラムダ式というのだ。
上記のコード例でいうところのConsumer<String> s = (String str) -> System.out.println(str);
がラムダ式となっている。一行ですっきりと処理がまとまっており、とても見やすい。
いつでも使える訳ではない
簡潔で見やすいラムダ式であるが、どのインタフェースに対してもできる書き方ではない。関数型インターフェースという抽象メソッドが一つしかないインタフェースに対してしか、この書き方は行えない。
public interface test { void test (); }
上記コードで示すインタフェースが関数型インターフェースとなっている。ご覧の通り、実装が必要な抽象メソッドが一つしかない。
public class Main { public static void main(String[] args) { test s = () -> System.out.println("test"); s.test(); } }
実行結果
test
つまりtestインタフェースのtestメソッドをラムダ式によって実装し実行しているということだ。抽象メソッドを一つ追加しただけの下記インタフェースに対してはラムダ式の記述は行えない。
public interface test { void test (); void execute (); }
ラムダ式の書き方
前記事にて関数型インタフェースについて、実際のコードを交えて理解する記事を書いた。しかし、初学者にとっては見慣れないコードになっていたのではないだろうか。その見慣れない形こそラムダ式である。
インタフェース名 オブジェクト名 = (引数1, 引数2, ...) -> return 処理内容;