🔧

🧠 Lambda式・関数型インターフェース・メソッド参照まとめ

に公開

🧠 Lambda式・関数型インターフェース・メソッド参照まとめ

🔸 関数型インターフェース (Functional Interface)

✅ 定義

  • 単一抽象メソッド (SAM, Single Abstract Method) のみを持つインターフェース。
  • ラムダ式またはメソッド参照を格納するための型ベースの役割。

✅ 特徴

  • 抽象メソッドは必ず1つだけ。
  • default, static メソッドは追加で定義可能。
  • @FunctionalInterface アノテーションの使用は任意。
@FunctionalInterface
interface Calculator {
    int operate(int a, int b);
}

🔸 ラムダ式 (Lambda Expression)

✅ 定義

  • 名前のない匿名関数を簡潔な文法で表現したもの。
  • 関数型インターフェースの実装方法の一つ。

✅ 特徴

  • 関数型インターフェースの抽象メソッドを実装。
  • 匿名クラスより簡潔。
  • 実行時に invokeDynamic を通して実体が生成される。

✅ 基本文法

(引数) -> { 実行文 }

✅ 使用例

Calculator add = (a, b) -> a + b;

✅ 文法バリエーション(表)

形式 文法 説明
引数1つ x -> x + 1 括弧省略可
引数0個または2個以上 () -> System.out.println("hi") 括弧必須
実行文1個 x -> System.out.println(x) 中括弧省略可
式のみ(return不要) x -> x * x returnなしでOK
引数型明示 (int x, int y) -> x + y 明示可能(推論されることも)

🔸 メソッド参照 (Method Reference)

✅ 定義

  • 既存メソッドをラムダ式の代わりに簡潔に参照する構文。
  • :: 演算子を使用。

✅ 使用条件

  • ラムダ式が単一メソッド呼び出しである場合。
  • 関数型インターフェースのメソッドシグニチャと参照先メソッドのシグニチャ(引数+戻り値)が一致する必要がある。

✅ 使用例

Printer p1 = (msg) -> System.out.println(msg); // Lambda式
Printer p2 = System.out::println;              // メソッド参照

✅ 種類別一覧

種類 文法 内部変換 説明
① 静的メソッド参照 ClassName::staticMethod x -> ClassName.staticMethod(x) 静的メソッドを直接参照
② 特定インスタンスのメソッド参照 instance::method x -> instance.method(x) 生成済みインスタンスのメソッド
③ クラスのインスタンスメソッド参照 ClassName::method (obj, arg1...) -> obj.method(arg1...) 呼び出し対象が第一引数になる
④ コンストラクタ参照 ClassName::new () -> new ClassName() コンストラクタを関数のように表現

Discussion