プログラミング
第17回
Javaラムダ式|関数型インターフェースとメソッド参照
ラムダ式の構文、関数型インターフェース、@FunctionalInterface、メソッド参照、匿名クラスとの比較と失敗例を学びます。
結論:ラムダ式は「関数型インターフェースの実装を短く書く」記法で (引数) -> 式/ブロック
Java 8以降、ラムダ式でイベント処理やStream操作を簡潔に書けます。対応するインターフェースは抽象メソッドが1つ(@FunctionalInterface)です。
基本構文
Runnable r = () -> System.out.println("run");
Comparator<String> cmp = (a, b) -> a.compareTo(b);
Predicate<String> notEmpty = s -> !s.isBlank();
メソッド参照
names.stream().map(String::toUpperCase).forEach(System.out::println);
既存メソッドをそのまま渡す短記法です。
失敗例:ラムダで使う変数が実質finalでない
int base = 0;
base++;
Runnable r = () -> System.out.println(base); // コンパイルエラー
キャプチャするローカル変数は変更不可(effectively final)である必要があります。
よく使う型
Predicate<T>— T -> booleanFunction<T,R>— T -> RConsumer<T>— T -> voidSupplier<T>— () -> T
まとめ
ラムダはStreamとセットで威力を発揮します。次回は関数型プログラミングの考え方(不変性・副作用)をJava文脈で整理します。
まとめ
Javaラムダ式は関数型インターフェースを簡潔に実装し、メソッド参照でさらに短く書けます。effectively final違反はコンパイルエラーの典型です。ComparatorやStreamのfilterにラムダを使って書き換え練習をしましょう。
次にやること
List<String>を長さ降順でソートするComparatorをラムダとメソッド参照の両方で書いて比較してください。
よくある質問
匿名クラスとラムダの違いは?
ラムダは関数型IF専用で簡潔。thisの意味や複数メソッド実装は匿名クラスが必要。
return を省略できる?
単一式なら省略可。ブロック {} を使う場合はreturn必須(void除く)。
自作の関数型IFは?
@FunctionalInterface を付けたinterfaceを定義し、抽象メソッド1つにします。
メソッド参照の種類は?
static、instance特定、instance任意、constructor の4種。
JavaScriptのアロー関数と同じ?
見た目は似ますが、Javaは関数型IF実装に限定され、thisの扱いも異なります。
次に読むべき記事
同カテゴリ「プログラミング」の記事
人気記事
- TS2307: Cannot find module '@components/Widget601' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget591' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget581' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget571' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget561' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget551' or its corresponding type declarations の原因と解決法
学習ルート
体系的に学びたい方はこちらから。
エラー解決コース →あわせて読みたい
- JavaのStream APIラムダの主な用途
- Javaの関数型プログラミング同じ講座の次の回
- Javaのコレクションフレームワークsort/removeIf
- Javaプログラミングのベストプラクティス簡潔なコード
- Javaの多態性interface実装