ラムダ式について
ラムダ式はメソッドを変数のように扱える特徴があります。
関数型インタフェース(抽象メソッドを一つのみ含むインタフェース)を匿名クラスを使用する場合より、短いコードで記述することができます。
こちら streamAPI を理解するためには必須の知識になるため、備忘録を兼ねてまとめました。
まず、匿名クラスを用いる場合と、ラムダ式を用いる場合を比較してみます。
匿名クラスを使用する場合
// 関数型インタフェース宣言
interface SampleInterface {
public String methodA(String word);
}
public class Sample {
public static void main(String[] args) {
// 匿名クラス
SampleInterface si = new SampleInterface(){
@Override
public String methodA(String word) {
return "Hello" + word;
}
};
System.out.println(si.methodA("yamada")); // -> Hello yamada
}
}
匿名クラスを使用する場合は以下の手順になる
- 関数型インタフェース宣言(自作する場合)
- 匿名クラスインスタンス化(関数型インタフェースの抽象メソッドをオーバーライド)
- メソッドコールでオーバライドした処理を実行
ラムダ式を使用して、記述を省略してみましょう
ラムダ式を使用する場合
ラムダ式の文法は下記のとおりです。(省略パターンがいくつもありますが、基礎文法を表記します)
(引数) -> {処理;};
※ }の直後に;を記述します。
これは、ラムダ式は関数を宣言しているのではなく、関数を変数に代入している「式」のため、末尾に;が必要だと解釈しています。
こちら、ご指摘いただきました。
}後の;はラムダ式の一部ではなく、文の終端記号になります。
引数は関数がインタフェースで定義した抽象メソッドの引数と同じ型になります(変数名は任意)
// 関数型インタフェース宣言
interface SampleInterface {
public String methodA(String word);
}
public class Sample {
public static void main(String[] args) {
// ラムダ式(変数にメソッドを代入しているイメージ)
SampleInterface si = (String word) -> {return "Hello" + word;};
System.out.println(si.methodA("yamada")); // -> Hello yamada
}
}
匿名クラスを使用したときと比較して記述がシンプルになりましたね。
ここから更に省略できます。
引数部の省略
関数型インタフェースは、抽象メソッドが 1 つなので、型を推論することができるので省略できます
(word) -> {return "Hello" + word;};
※型を省略するときはすべて省略しなければエラーになります(一部の省略は不可です)
さらに引数が一つしかない場合については()すら省略可能です。
word -> {return "Hello" + word;};
引数が無い場合は()を省略することはできません。
() -> {処理;};
処理部の省略
ラムダ式の処理が 1 行しかない場合は return と{ }を省略できます。
(word) -> {return "Hello" + word;};
このコードが
(word) -> "Hello" + word;
このように省略できます。
省略パターンまとめ
引数部についての省略
- 型を省略できる(関数型インタフェースはメソッドが1つなので推論できるため)
- 引数が一つの場合、( )も省略可能
処理部についての省略
- 処理が 1 行の場合、retun と{ }を省略できる
次回は、streamAPIについてまとめたいと思います。