1. ラムダ式とは
- JavaSE8から導入された構文
- 関数型インターフェースを簡潔に記載することができる
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
// こういうやつ
list.forEach(i -> System.out.println(i));
// 結果
// A
// B
// C
2. 無名クラス(匿名クラス)と関数型インターフェース
無名クラス(匿名クラス)とは
- 名前がないクラスのこと
- 一度きりしか使わないといった場合に使用する
- コードの記載が綺麗になる
無名クラスを使用する場合、new class名()の後に{}を記載します
※関数型インターフェースのConsumerを使用していますが後で説明あります
無名クラスを使用しない場合
class CustomConsumer implements Consumer<String> {
@Override
public void accept(String s) {
System.out.println(s);
}
}
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
CustomConsumer consumer = new CustomConsumer();
list.forEach(consumer);
// 結果
// A
// B
// C
無名クラスを使用した場合
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Consumer consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
list.forEach(consumer);
// 結果
// A
// B
// C
関数型インターフェースとは
抽象メソッドを一つのみ持つインターフェースのこと
※抽象メソッド:メソッド名のみ定義されているメソッドのこと
// 例
interface Runnable {
// 抽象メソッドは一つのみ
void run();
}
JavaAPIには関数型インターフェースがいくつか用意されています
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
代表的な関数型インターフェース
-
Runnable: 実行可能
引数はなく、結果を返さない
run()を関数メソッドに持つ -
Consumer: 消費者
引数があり、結果を返さない
accept(Object)を関数メソッドに持つ -
Supplier: 供給者
引数がなく、結果を返す
T get()を関数メソッドに持つ -
Predicate: 断言する
引数があり、結果をbooleanで返す
boolean test(T t)を関数メソッドに持つ
3. ラムダ式
- 関数型インターフェースを簡潔に記載することができる
無名関数を使用する場合、しない場合、ラムダを使用する場合までの変化を以下サンプルで記載
1. 無名クラスを使用しない場合
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable is run!");
}
}
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
2. 無名クラスを使用する場合(そのまま引数に設定)
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable is run!");
}
}).start();
3. ラムダ式を使用した場合
// クラス名の記載は不要
// 引数があれば()に記載する
new Thread(() -> {
System.out.println("Runnable is run!");
}).start();
// 引数がないので()も不要
new Thread(System.out.println("Runnable is run!")).start();
// 備考
// 引数が一意かつ処理内容のメソッドが一つのみのためクラス名::メソッド名のような書き方が可能
new Thread((string) -> System.out.println(string)).start();
↓
new Thread(System.out::println).start();