Java | 実務で避けるべき Stream のアンチパターン集

Java Java
スポンサーリンク

では、初心者向けに 「for → Stream → 集計・変換・フィルタ」 の流れを 図解付きで1枚にまとめるイメージ にします。


初心者向け Stream API 図解フロー

┌──────────┐
│      データ       │
│ List / 配列など   │
└────┬─────┘
        │
        ▼
┌──────────┐
│   拡張 for文     │
│ for (x : list)  │
│   {処理}         │
└────┬─────┘
        │
        ▼
┌──────────┐
│   Stream API     │
│ list.stream()    │
└────┬─────┘
        │
        ▼
┌─────────────────┐
│ 中間操作(filter/map/sorted) │
│ - filter(x -> 条件)          │
│ - map(x -> 変換)             │
│ - sorted()                   │
└────┬────────────┘
        │
        ▼
┌─────────────────┐
│ 末端操作(collect/forEach)   │
│ - collect(toList())          │
│ - forEach(処理)              │
└────┬────────────┘
        │
        ▼
┌───────────────┐
│      結果                 │
│ List / 出力 / 集計        │
└───────────────┘

例:フィルタ + 変換 + 集計

List<String> names = List.of("Alice", "Bob", "Charlie", "Dave");

// 拡張 for 文
List<String> filtered = new ArrayList<>();
for (String n : names) {
    if (n.length() > 3) {
        filtered.add(n.toUpperCase());
    }
}

// Stream API
List<String> filteredStream = names.stream()
    .filter(n -> n.length() > 3)   // 条件で抽出
    .map(String::toUpperCase)      // 大文字に変換
    .collect(Collectors.toList()); // List にまとめる
Java

フローで理解すると:

List ["Alice","Bob","Charlie","Dave"]
        │
   filter(length>3)
        │
["Alice","Charlie","Dave"]
        │
   map(toUpperCase)
        │
["ALICE","CHARLIE","DAVE"]
        │
collect(toList)
        │
結果 → ["ALICE","CHARLIE","DAVE"]

便利な追加ポイント

  • 複数条件でフィルタ
    .filter(x -> x.length()>3 && x.startsWith("A"))
  • 集計
    .mapToInt(String::length).sum()
  • グループ化
    .collect(Collectors.groupingBy(String::substring(0,1)))

💡 初心者向けコツまとめ

  1. 順序は「データ → 中間操作 → 末端操作 → 結果」
  2. 中間操作(filter/map/sorted)は遅延実行
  3. 末端操作(collect/forEach)で初めて処理が実行される
  4. 副作用は末端で最小限にする
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました