StackShelf
プログラミング 第17回

Javaラムダ式|関数型インターフェースとメソッド参照

ラムダ式の構文、関数型インターフェース、@FunctionalInterface、メソッド参照、匿名クラスとの比較と失敗例を学びます。

2分で読める
Javaラムダ関数型

結論:ラムダ式は「関数型インターフェースの実装を短く書く」記法で (引数) -> 式/ブロック

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 -> boolean
  • Function<T,R> — T -> R
  • Consumer<T> — T -> void
  • Supplier<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の扱いも異なります。

次に読むべき記事

同カテゴリ「プログラミング」の記事

学習ルート

体系的に学びたい方はこちらから。

エラー解決コース →

あわせて読みたい