Java 8以降のコードを見ていると、次のような書き方をよく見かけます。
list.stream()
.filter(n -> n > 0)
.forEach(System.out::println);
「for文じゃダメなの?」「-> って何?」と感じた方も多いのではないでしょうか。
この記事では Java初心者向け に、
- ラムダ式とは何か
- Stream API とは何か
- 従来の for文との違い
- よく使う書き方
を 段階的に 解説します。
1. ラムダ式とは?
一言でいうと
「処理(関数)をそのまま値として渡せる書き方」 です。
2. まずは従来の書き方(for文)
例えば、リストの中から「正の数だけを表示する」処理です。
import java.util.List;
List<Integer> list = List.of(-1, 2, 0, 5);
for (Integer n : list) {
if (n > 0) {
System.out.println(n);
}
}
これは問題なく動きますが、
- 処理が増えるとネスト(階層)が深くなる
- 「何をしたいか」より「どう書くか」が前に出る
という欠点があります。
3. ラムダ式の基本構文
基本形
引数 -> 処理
例:
n -> n > 0
これは、
(int n) {
return n > 0;
}
を 省略して書いたもの です。
4. Stream API とは?
一言でいうと
「データの流れ(Stream)に対して処理を順番につなげて書ける仕組み」 です。
- データを集める
- 条件で絞る
- 変換する
- 結果を使う
という流れを 宣言的 に書けます。
5. Stream API を使った書き方
先ほどの例を Stream API で書くと、次のようになります。
import java.util.List;
List<Integer> list = List.of(-1, 2, 0, 5);
list.stream() //データを集める
.filter(n -> n > 0) //条件で絞り、変換する
.forEach(n -> System.out.println(n)); //結果を使う
処理の流れ
-
stream()
→ ListをStreamに変換 -
filter(n -> n > 0)
→ 条件に合うものだけ残す -
forEach(...)
→ 要素を1つずつ処理する
6. よく使う Stream API の代表例
filter(条件で絞る)
list.stream()
.filter(n -> n >= 0)
.forEach(System.out::println);
map(変換する)
list.stream()
.map(n -> n * 2)
.forEach(System.out::println);
sum(合計する)
int sum = list.stream()
.filter(n -> n > 0)
.mapToInt(n -> n)
.sum();
7. ラムダ式が使われている理由
メリット
- コードが短くなる
- 「何をしたいか」が読みやすい
- nullチェックや一時変数が減る
- バグが入りにくい
デメリット
- 最初は読みにくい
- デバッグが難しい場合がある
初心者のうちは「読める」ことを目標にすればOKです。
8. Stream API と for文の使い分け
| 観点 | for文 | Stream API |
|---|---|---|
| 単純なループ | ◎ | △ |
| 条件・変換が多い | △ | ◎ |
| 可読性 | 処理次第 | 高い |
| Java 8未満 | ◎ | ❌ |
9. 初心者向け結論
- ラムダ式は「処理を簡潔に書くための記法」
- Stream API は「データ処理を流れとして書く仕組み」
- 無理に使わず、読めるようになることが最優先
10. まとめ
-
->はラムダ式 -
stream()でデータの流れを作る - Stream API は for文の置き換えではなく 別の考え方
- 慣れるとコードがかなり読みやすくなる
Java初心者の方は、「処理の流れを日本語で読めるか」 を意識すると理解が早くなります。