Java | 実務でよく使う for → Stream 書き換え10パターン

Java Java
スポンサーリンク

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件を取得する

フロー(要約)

  1. list.stream() で流を開始
  2. filter(name -> name.startsWith(“A”)) で ‘A’ のものだけ通す
  3. map(String::toUpperCase) で大文字化
  4. distinct() で重複除去(必要なら)
  5. limit(5) で先頭5件だけ取得
  6. 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; })
  • null の Stream 化: null のコレクションに .stream() を呼ぶと NullPointerException
    • 対策: Optional.ofNullable(list).orElse(Collections.emptyList()).stream()
  • 並列化の落とし穴: parallelStream() は早くなる場合もあるが、順序やスレッド安全性に注意。

参考(短い手順メモ)

  1. stream() で開始
  2. 必要な中間操作をチェーン(filter, map, flatMap, sorted, distinct, limit, skip
  3. 終端操作で結果を得る(collect, forEach, count, findFirst
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました