🧠【初心者向け】Java Stream API の仕組みをやさしく解説(図解あり)
Java の Stream API は便利ですが、初心者には少し難しく感じます。
- filter と map の違いは?
- なぜメソッドチェーンで書けるの?
- 中間操作と終端操作って何?
- 遅延評価ってどういう意味?
- 途中で何が行われているの?
この記事では
初心者向けのやさしい解説 と
内部構造の深掘り の両方から
Stream API を直感的に理解できるようまとめます。
✨ 結論
✔ Stream API は「データ処理のパイプライン」
✔ 中間操作(filter, map)は“処理内容の登録”
✔ 終端操作(collect, forEach)が実行トリガー
✔ Stream は“遅延評価”によって効率的
✔ 内部では「Sink チェーン」「Spliterator」が働いている
Stream API は“パイプライン処理”
Stream の本質は データを順に流すパイプライン。
🔹 図解(短線版)
データ → [filter] → [map] → [collect]
中間操作と終端操作の違い
✔ 中間操作(Intermediate Operation)
- filter
- map
- sorted
- distinct
- limit
👉 処理の登録だけで実行しない
✔ 終端操作(Terminal Operation)
- forEach
- collect
- reduce
- count
👉 ここで初めて実行される(遅延評価)
遅延評価とは?
必要になるまで実行を遅らせて効率化する仕組み
例:
list.stream()
.filter(x -> x > 10)
.map(x -> x * 2)
.count(); // ここで全部実行
ストリームはデータを破壊しない
✔ Stream は“元のリストを変更しない”
→ リストとストリームは別物
✔ 再利用不可
→ 1回実行したらもう使えない
Java Stream API の“落とし穴”(初心者向け)
✔ ループ内で stream を毎回作らない
✔ 重い処理は parallelStream で逆に遅くなる
✔ null が入っていると NPE が起きる
✔ 終端操作を2回呼ぶと IllegalStateException
ここまでのまとめ(初心者向け)
- Stream はパイプライン
- 中間操作は“登録”、終端操作が“実行”
- 遅延評価により無駄を減らせる
- 元のデータは変更されない
- 落とし穴もあるので注意
▼▼ 深掘り編ここから ▼▼
Stream API 内部構造の本質(Sink チェーン)
Stream は内部的に 「Sink」 と呼ばれる処理が
チェーン状につながっています。
🔹 図解(短線版)
Source → Sink(filter) → Sink(map) → Sink(collect)
各 Sink は
- begin(開始)
- accept(要素受け取り)
- end(終了)
の3つで構成されています。
実行時は“ネストされたループ”で動く(重要)
filter → map → collect という順番で
要素ごとに処理されます。
🔹 図解
for(要素 e : source) {
if(filter(e)) {
mapped = map(e)
collector.add(mapped)
}
}
Spliterator(分割しながら走る仕組み)
Stream のソース(List など)は
Spliterator を通して要素が渡されます。
✔ 分割可能 (parallelStream 用)
✔ サイズ推定ができる
✔ 順序維持や特性を持つ
parallelStream の内部(Fork/Join)
parallelStream は ForkJoinPool を使用して
複数のスレッドで処理を分割実行します。
🔹 図解(短線版)
データ
├─ 部分1 → スレッド1
├─ 部分2 → スレッド2
└─ 部分3 → スレッド3
↓
最後にマージ
しかし注意!
- CPUバウンド処理で遅くなる
- コレクションサイズが小さいと逆に効率悪い
- サーバーアプリでは基本 非推奨
状態を持つ map / filter の危険性
内部的に並行処理される場合
状態を持つと危険。
map(x -> counter++) // NG
→ スレッド安全でないため予測不能な結果に。
Collector の内部構造(やや応用)
Collector は以下の3要素で構成:
- supplier(初期化)
- accumulator(追加処理)
- combiner(parallel用の結合)
主に Collectors.toList() などがこれに該当。
Deep Friendly Tech の一言(後書き)
Stream API は
「便利な文法」ではなく「データ処理モデル」 です。
内部構造を理解することで
- 効率的なストリーム設計
- パフォーマンス劣化の回避
- parallelStream の適切な判断
ができるようになります。
データ処理に強いエンジニアへ
一歩近づく重要な知識です。

コメント