for → Stream 視覚教材:filter → map → collect の流れ
この資料は for文からStream APIへ変換 する際に、初心者が直感的に理解できるように「処理の流れ」を視覚化した教材です。まずは図を見て流れを掴み、下にある具体例で確認しましょう。
全体フロー(図)
データ源(List, 配列)
│
▼
list.stream() ---> (中間操作)filter() ------┐
│
(中間操作)map() ---> (中間操作)sorted()/distinct()/limit()/skip() ...
│
▼
(終端操作)collect(toList()) / forEach() / count() / findFirst()
見方:左から右へ“データが流れる”イメージ。
filter()が選別、map()が変換、collect()が結果をまとめる。
視覚的ポイント(色付きイメージの擬似説明)
- filter(絞り込み):条件に合う要素だけ通す「ふるい」
- map(変換):要素を別の形に変える「変換機」
- flatMap(平坦化):入れ子リストを平らにする「展開機」
- sorted / distinct / limit / skip:整列 / 重複排除 / 件数制限 / スキップ
- collect(終端):最終結果をリストやマップにまとめる
具体例:実務でよくあるパターン(図解付き)
例:名前リストから、先頭が ‘A’ の大文字化された先頭5件を取得する
フロー(要約)
- list.stream() で流を開始
- filter(name -> name.startsWith(“A”)) で ‘A’ のものだけ通す
- map(String::toUpperCase) で大文字化
- distinct() で重複除去(必要なら)
- limit(5) で先頭5件だけ取得
- collect(Collectors.toList()) で List にまとめる
コード
List<String> result = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.distinct()
.limit(5)
.collect(Collectors.toList());
Java図(擬似)
names (Abe, bob, Alice, ann, Abe, Andy, ...)
│
▼
/filter: startsWith('A')/ -> (Abe, Alice, ann, Abe, Andy)
│
▼
/map: toUpperCase/ -> (ABE, ALICE, ANN, ABE, ANDY)
│
▼
/distinct()/ -> (ABE, ALICE, ANN, ANDY)
│
▼
/limit(5)/ -> (ABE, ALICE, ANN, ANDY)
│
▼
/collect(toList)/ -> List[ABE, ALICE, ANN, ANDY]
小さなワーク(理解チェック)
- 問1: 数値リストから偶数のみを2倍にしてListにするStreamを書きなさい。
- 問2: List<List> を平坦化して1つのListにするStreamを書きなさい。
(答えは下に記載)
答1
List<Integer> out = nums.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.toList();
Java答2
List<String> flat = listOfLists.stream()
.flatMap(List::stream)
.toList();
Java⚠️ よくあるミス(図解付きで注意)
- 副作用を作る:
map()やfilter()内で外部のリストをadd()すると並列化で破綻する可能性がある。- NG:
.map(x -> { list.add(x); return x; })
- NG:
- null の Stream 化:
nullのコレクションに.stream()を呼ぶとNullPointerException。- 対策:
Optional.ofNullable(list).orElse(Collections.emptyList()).stream()
- 対策:
- 並列化の落とし穴:
parallelStream()は早くなる場合もあるが、順序やスレッド安全性に注意。
参考(短い手順メモ)
stream()で開始- 必要な中間操作をチェーン(
filter,map,flatMap,sorted,distinct,limit,skip) - 終端操作で結果を得る(
collect,forEach,count,findFirst)

