( 本記事の目次 )
ラムダ式
再利用することのない、その場限りのクラスを定義する場合、Java SE 7では、Sample2.javaのように匿名クラスを使用していましたが、可読性があまり良くなくコードも冗長になりがちでした。
Java SE 8ではラムダ式を使用することで、同じことをシンプルに実装することができます。Java SE 8のAPIで追加された関数型インタフェースは、ラムダ式で実装することを前提として提供されています。
ラムダ式の構文は次のとおりです。
( 実装するメソッドの引数 ) -> { 処理 };
ラムダ式の定義には->
を使います。->
の左辺には実装するメソッドの引数を、右辺には実装する処理を記述します。
ラムダ式では、関数型インタフェースの変数に、ラムダ式で記述された実装コードを代入します。Sample1.javaをラムダ式で実装した場合を見てみましょう(Sample3.java)。実行結果はSample1.javaと同じであるため掲載を割愛します。
import java.util.function.Function; public class Sample3 { public static void main(String[] args) { Function<String, String> obj = (String str) -> { return "Hello " + str; }; String str = obj.apply("naoki"); System.out.println(str); } }
5行目ではFunction
型の変数を宣言し、ラムダ式で記述された実装コードを代入しています。5~7行目を見てみると、Function
インタフェースを使用することは推測できますが、apply()
のメソッド名が記述されていません。これは、関数型インタフェースは抽象メソッドが1つしかなく、ラムダ式がどのメソッドを実装するかを判断できるからです。そのため記載する必要がありません。
Function
インタフェースのapply()
メソッドの引数はString
型を1つとるため、->
の左辺は(String str)
としています。そして、右辺が実装コードです。
ラムダ式の省略記法
ところで、先ほど「ラムダ式を用いるとシンプルに実装ができる」といいましたが、まだコード量は多く感じますね。実は、ラムダ式は様々な省略した記述が可能です。まず、->
の左辺を見てみましょう。
次に、->
の右辺を見てみましょう。
Sample4.javaは、Sample3.javaのラムダ式を省略したコードです。匿名クラスの実装例であるSample2.javaと比べ、シンプルな実装になったことがわかります。
import java.util.function.Function; public class Sample4 { public static void main(String[] args) { Function<String, String> obj = str -> "Hello " + str; String str = obj.apply("naoki"); System.out.println(str); } }
注意
Silver SE 8試験では、省略した場合、省略しない場合ともに出題されるので確認しておきましょう。
なお、ラムダ式の仕様は大きいため、本記事ではSilver SE 8試験の範囲に説明を絞っています。ラムダ式の詳細はProject Lambdaサイトを参照してください。