Javaのラムダ式
関数型インターフェイスを実装したクラスのインスタンスを、簡単に作るための文法です。
言い換えれば、クラスの宣言とインスタンスの生成を同時に行う文法。
Javaのラムダ式で関連するのは、関数型インターフェース、またこの関数型インターフェースは抽象メソッドを一つだけもつ。
1つだけというところがポイント。
通常のクラスからラムダ式になるまで
こちらを参考に学んでみました。
第1段階(内部クラス)
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
class ComparatorImpl implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
}
Comparator<String> c = new ComparatorImpl();
System.out.println(c.compare("ABC", "DEF"));
}
}
第2段階(匿名クラス)
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
/*
class ComparatorImpl implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
}
*/
Comparator<String> c = new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
};
System.out.println(c.compare("ABC", "DEF"));
}
}
Comparator<String> c = new ComparatorImpl();
の右辺が new Comparator()になり、さらに{}内に式を書きます。
ラムダ式完成形
- 右辺のComparator()を削除します。
- 抽象メソッドcompareメソッドのpublic intを削除します。
- 抽象メソッドcompareも削除します。
- 抽象メソッドの引数の型Stringを削除します。
- 抽象メソッドのreturnを削除します。
- new Comparator()も削除します。
- {と}を削除し、抽象メソッドの引数から処理部分は->でつなぎます。
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Comparator<String> c = (s1, s2) -> s1.compareTo(s2);
System.out.println(c.compare("ABC", "DEF"));
}
}
だいぶ簡単になりましたね。
抽象メソッドが1つということで引数や戻り値の型をかかず、省略できました。