Javaで (x,y)->x+y
の形を見ても、どう書けば正しいのか、何ができるのかわからないことはありませんか?
私も最初、「Functional Interfaceって何?」「メソッド参照はどう使うの?」と戸惑いました。
この記事では、ラムダ基本構文から関数型インターフェース、メソッド参照、Stream API連携、クロージャの仕組みまで、小学生でもわかる言葉でしっかり解説します。
「ラムダを使ったらループが激減し、コードが一気にスッキリした!」という声も多く聞かれます。
list.stream().filter(n->n%2==0).forEach(System.out::println);
のように、一行で絞り込み・出力ができるんです。
さあ、Javaのラムダ式をマスターして、読みやすくて短いコードを書けるようになりましょう!
ラムダ式の基本構文を覚えよう
ラムダ式は「引数 → 処理」の形で書ける短い関数です。これを使うと、コードがシンプルになります。
通常、匿名クラスで書くと5~7行必要な処理が、ラムダ式なら1行で済みます。可読性が上がり、バグも入りにくくなるからです。
具体例を見てみましょう!
// 普通の匿名クラス
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
}).start();
// 同じ処理をラムダ式で
new Thread(() -> System.out.println("Hello")).start();
ここでは、()
が引数、->
の右側が実行内容です。引数が1つなら括弧()
を省略でき、処理が1行ならブロック{}
も省略できます。
ラムダ式の構文は「(引数) -> {処理}」。これを覚えれば、Javaでも関数を“軽く”書けるようになります!
FunctionalInterfaceとの関係を理解する
ラムダ式は「関数型インターフェース(@FunctionalInterface)」に対してだけ使えます。
関数型インターフェースは抽象メソッドを1つだけ持つインターフェースです。これによって、コンパイラがどのメソッドを実装しているか判断できます。
@FunctionalInterface
interface Adder {
int add(int a, int b);
}
Adder adder = (a, b) -> a + b;
System.out.println(adder.add(3, 5)); // → 8
Runnable
や Supplier<T>
、Consumer<T>
も関数型インターフェースの一例です。
自作の関数型インターフェースを作ると、ラムダ式を自由に活用できます。
メソッド参照(::)の使いどころとメリット
メソッド参照はラムダ式をもっと簡潔に書く方法です。
ラムダ式の中で既存メソッドを呼び出すだけなら、ClassName::methodName
形式で記述でき、可読性が向上します。
List<String> names = List.of("Alice", "Bob", "Carol");
// ラムダ式
names.forEach(name -> System.out.println(name));
// メソッド参照
names.forEach(System.out::println);
静的メソッド参照 (Math::max
) やインスタンスメソッド参照 (obj::instanceMethod
)、コンストラクタ参照 (ClassName::new
) も使えます。
メソッド参照を使うと、ラムダ式よりも短くシンプルに書けます。
Stream APIと組み合わせた実践例
Stream API とラムダ式を組み合わせると、データ処理が一行で書けてとても便利です。
filter
、map
、collect
などの中間操作をチェーンでき、可読性と再利用性が向上します。
List<Integer> nums = List.of(1, 2, 3, 4, 5);
List<Integer> evens = nums.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println(evens); // → [4, 16]
並列処理には parallelStream()
を、順序を指定したい場合は sorted()
を使えます。
Stream API とラムダ式を組み合わせると、データ操作が直感的に書けます。
まとめ:Javaラムダ式でコードを最適化しよう
本記事では、Javaのラムダ式について以下のポイントを学びました。
- 基本構文:
(引数) -> 処理
の形で短い関数を書ける。 - 関数型インターフェース:抽象メソッド1つのインターフェースに対してのみ使用可能。
- メソッド参照:
ClassName::methodName
でラムダを簡潔に置き換え。 - Stream API連携:
filter/map/collect
などでデータ処理を直感的にチェーン。 - クロージャ:外側変数を実質finalとしてキャプチャし、安全に利用。
ラムダ式を使いこなすと、従来の匿名クラスよりも格段に少ないコードで同じ処理が書けます。ぜひ、今日からJavaのラムダ式を活用して、読みやすく、保守しやすいコードを書いてみてください!