ここでは、Stream API の主要構文(map / filter / sorted / groupingBy など)を図解で理解できる早見表を作ります。
「操作の意味」「処理の流れ」「例」を視覚的に整理しました。
Stream API 図解早見表
Collection/Array
│
▼
stream() ──▶ Stream開始
│
▼
┌─────────────┐
│ 中間操作 │ (元データは変わらない)
│ filter() │ 条件で要素を絞り込む
│ map() │ 要素を別の形に変換
│ distinct() │ 重複を除去
│ sorted() │ 並び替え
│ limit()/skip() │ 件数制限/スキップ
│ flatMap() │ ネストをフラット化
└─────────────┘
│
▼
┌─────────────────────┐
│ 終端操作 │ (ここで処理が実行される)
│ collect() │ リストやマップに変換
│ forEach() │ 各要素に副作用処理
│ count() │ 件数を取得
│ findFirst() │ 先頭要素を取得
│ anyMatch()/allMatch()/noneMatch() │ 条件判定
└─────────────────────┘
操作例と流れ
1️⃣ filter():条件で絞り込み
list.stream()
.filter(s -> s.startsWith("A"))
.collect(Collectors.toList());
Java- 意味:Aで始まる要素だけ残す
- 図イメージ:
[Apple, Banana, Avocado]
│ filter(s -> startsWith("A"))
▼
[Apple, Avocado]
2️⃣ map():要素を変換
list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
Java- 意味:文字列を大文字に変換
- 図イメージ:
[apple, banana, cherry]
│ map(String::toUpperCase)
▼
[APPLE, BANANA, CHERRY]
3️⃣ sorted():並び替え
list.stream()
.sorted()
.collect(Collectors.toList());
Java- 意味:自然順序でソート
- 図イメージ:
[Charlie, Alice, Bob]
│ sorted()
▼
[Alice, Bob, Charlie]
4️⃣ distinct():重複除去
list.stream()
.distinct()
.collect(Collectors.toList());
Java- 意味:重複した要素を1つにまとめる
- 図イメージ:
[Alice, Bob, Alice, Charlie]
│ distinct()
▼
[Alice, Bob, Charlie]
5️⃣ limit() / skip():件数制御
list.stream()
.skip(2)
.limit(3)
.collect(Collectors.toList());
Java- 意味:先頭2件スキップ → 次の3件を取得
- 図イメージ:
[1,2,3,4,5,6]
│ skip(2)
▼
[3,4,5,6]
│ limit(3)
▼
[3,4,5]
6️⃣ flatMap():ネストを平坦化
listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
Java- 意味:List<List> → List
- 図イメージ:
[[1,2], [3,4], [5]]
│ flatMap()
▼
[1,2,3,4,5]
7️⃣ groupingBy():グループ化
Map<String, List<User>> grouped =
users.stream()
.collect(Collectors.groupingBy(User::getDept));
Java- 意味:部署ごとにユーザーを分類
- 図イメージ:
[User(A), User(B), User(C)]
│ groupingBy(getDept)
▼
{ Dept1: [User(A), User(C)], Dept2: [User(B)] }
8️⃣ まとめ(黄金パターン)
list.stream()
──> filter() // 条件で絞る
──> map() // 変換する
──> sorted() // 並び替える
──> distinct() // 重複除去
──> limit()/skip() // 件数調整
──> flatMap() // ネスト平坦化
──> collect() / forEach() / count() ... // 終端操作で結果を取得
Java💡 コツ
- 中間操作は「元データは変えない」
- 終端操作で初めて処理が実行される
- パイプラインで左から右へ流れを考えると理解しやすい

