🧠 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);
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