🤖
【Java Gold】ラムダ式とメソッド参照
はじめに
ラムダ式とメソッド参照について、試験対策として整理しました。
ラムダ式とメソッド参照について
Javaのラムダ式とメソッド参照は、関数型インタフェース(SAM:Single Abstract Method)を利用して、処理を簡潔に記述するための機能です。
ラムダ式の基本構文
(引数) -> { 処理 }
ラムダ式のバリエーション
形式 | 書き方 | 説明 |
---|---|---|
引数なし | () -> System.out.println("Hello") |
Runnable によく使われる形式 |
引数1つ | s -> s.length() |
型推論が適用される |
引数2つ | (a, b) -> a + b |
複数引数の例 |
ブロックあり | (x) -> { System.out.println(x); return x * 2; } |
複数文なら {} が必要 |
主な関数型インタフェースと使用例
インタフェース | 引数 | 戻り値 | 使用例 |
---|---|---|---|
Runnable |
なし | なし | () -> System.out.println("Run") |
Supplier<T> |
なし | T | () -> "Hello" |
Consumer<T> |
T | なし | s -> System.out.println(s) |
Function<T, R> |
T | R | s -> s.length() |
Predicate<T> |
T | boolean | s -> s.isEmpty() |
BiFunction<T, U, R> |
T, U | R | (a, b) -> a + b |
メソッド参照の基本
ラムダ式が「既存のメソッド呼び出しのみ」の場合、より簡潔に書けるのがメソッド参照です。
メソッド参照の書式と例
書式 | 例 | 説明 |
---|---|---|
クラス名::staticメソッド |
Math::max |
静的メソッドの参照 |
オブジェクト::インスタンスメソッド |
"abc"::toUpperCase |
特定オブジェクトのメソッド |
クラス名::インスタンスメソッド |
String::length |
引数のオブジェクトに対して呼ばれる |
クラス名::new |
ArrayList::new |
コンストラクタの参照 |
ラムダ式からメソッド参照への変換例
ラムダ式 | メソッド参照 |
---|---|
s -> s.length() |
String::length |
() -> new ArrayList<>() |
ArrayList::new |
(x, y) -> Math.max(x, y) |
Math::max |
s -> System.out.println(s) |
System.out::println |
メソッド参照の注意点
- メソッドの引数の数・型・戻り値の型が、対象の関数型インタフェースと一致している必要がある
- 複雑な処理や条件分岐がある場合は、ラムダ式の方が明示的で読みやすい
ラムダ式とメソッド参照の比較
観点 | ラムダ式 | メソッド参照 |
---|---|---|
可読性 | 柔軟で直感的 | より簡潔でスッキリ |
表現できる処理 | 任意の処理(複雑なロジックもOK) | 既存メソッドの呼び出しのみ |
適した場面 | 処理が複雑、複数行になる場合 | 単純な処理、1メソッド呼び出しのみ |
おわりに
誤記や改善点があればコメントなどでご指摘ください。
Discussion