では 「for文 vs Stream API の比較フロー図」 を初心者向けに1枚にまとめます。
処理の流れと結果が一目で分かるように設計しました。
for文 vs Stream API 比較図(初心者向け)
[データ入力] List<String> names = ["Alice","Bob","Charlie","Dave"]
───────────── for文 ─────────────
for (String n : names) {
if (n.length() > 3) { ← 条件フィルタ
result.add(n.toUpperCase()); ← 変換 + 結果格納
}
}
result → ["ALICE","CHARLIE","DAVE"]
───────────────▲───────────────
│
│ 処理の手順を順番に書く命令的スタイル
│
───────────── Stream API ────────────
names.stream() ← データ入力
.filter(n -> n.length() > 3) ← 条件フィルタ(中間操作)
.map(String::toUpperCase) ← 変換(中間操作)
.collect(Collectors.toList()) ← 結果格納(末端操作)
filteredStream → ["ALICE","CHARLIE","DAVE"]
───────────────▲───────────────
│
│ 宣言的スタイル(何をしたいかをチェーンで表現)
ポイント解説
| 観点 | for文 | Stream API |
|---|---|---|
| 処理の書き方 | 手順通りに命令的に書く | 宣言的に「何をしたいか」をチェーンで表現 |
| 可読性 | 小規模なら直感的 | 中規模以上・変換や集計がある場合は読みやすい |
| 副作用 | 外部リストへの add が必要 | map/filter で副作用なしで安全 |
| 並列化 | 自分で制御が必要 | parallelStream() で簡単 |
| 集計・変換 | for文内で逐次処理 | map/filter/collect で簡潔に処理 |
処理フローまとめ
1. データ入力
2. 条件でフィルタ(filter)
3. データを変換(map)
4. 結果を格納(collect / result.add)
5. 出力 or 次の処理
- for文 → 手順を順番に書く
- Stream → 「何をしたいか」をチェーンで表現
この図を応用すれば、
- 複雑なフィルタ + 集計
- DTO変換やグループ化
なども、「for文でどう書くか」→「Streamでどう書くか」 を一目で比較できます。
