Java | Stream API パイプライン図解

Java Java
スポンサーリンク

では、「filter → map → sorted → groupingBy」の一連パイプラインを図解で直感理解」できる教材を作ります。

例題:社員リストを加工して部署ごとに名前を並び替え集計する

入力データ

class Employee {
    String name;
    String dept;
    int age;
    Employee(String n, String d, int a){ name = n; dept = d; age = a; }
}

List<Employee> employees = List.of(
    new Employee("Alice", "DeptA", 30),
    new Employee("Bob", "DeptB", 22),
    new Employee("Charlie", "DeptA", 25),
    new Employee("David", "DeptB", 28),
    new Employee("Eve", "DeptC", 35)
);
Java

1️⃣ 目的の処理

  • 年齢 ≥ 25 の社員だけ抽出 → filter()
  • 名前を大文字に変換 → map()
  • 名前順に並び替え → sorted()
  • 部署ごとにまとめる → groupingBy()

2️⃣ Stream API コード

Map<String, List<String>> result = employees.stream()
    .filter(e -> e.age >= 25)              // 年齢25以上
    .map(e -> new Employee(e.name.toUpperCase(), e.dept, e.age)) // 名前大文字化
    .sorted(Comparator.comparing(e -> e.name)) // 名前順
    .collect(Collectors.groupingBy(
        e -> e.dept,
        Collectors.mapping(e -> e.name, Collectors.toList())
    ));

System.out.println(result);
Java

3️⃣ 処理パイプライン図(直感理解用)

[入力リスト: employees]
Alice-DeptA-30, Bob-DeptB-22, Charlie-DeptA-25, David-DeptB-28, Eve-DeptC-35
        │
        ▼
(filter) 年齢 >= 25
Alice-DeptA-30, Charlie-DeptA-25, David-DeptB-28, Eve-DeptC-35
        │
        ▼
(map) 名前を大文字化
ALICE-DeptA-30, CHARLIE-DeptA-25, DAVID-DeptB-28, EVE-DeptC-35
        │
        ▼
(sorted) 名前順
ALICE-DeptA-30, CHARLIE-DeptA-25, DAVID-DeptB-28, EVE-DeptC-35
        │
        ▼
(groupingBy) 部署ごとに集計
{
  DeptA -> [ALICE, CHARLIE],
  DeptB -> [DAVID],
  DeptC -> [EVE]
}

4️⃣ ポイント解説

ステップメソッド何をするか
1filter()条件に合う要素だけ残す(年齢25以上)
2map()各要素を変換(名前を大文字化)
3sorted()名前順に並び替え
4groupingBy() + mapping()部署ごとに社員名をまとめる
  • 矢印の流れで「左から右へ処理が順に流れる」と考えると分かりやすい
  • collect() 内でまとめる処理は Stream パイプラインの最後 に書く

5️⃣ 視覚的覚え方

INPUT -> filter -> map -> sorted -> groupingBy -> OUTPUT
  • filter → 選ぶ
  • map → 変える
  • sorted → 並べる
  • groupingBy → まとめる

この順番を覚えておくと、Stream API の複雑な処理も直感的に理解できます。


💡 実務例:

  • 社員データ → 部署別・年齢条件付きの名簿作成
  • 商品データ → 売上高条件で抽出・名前順に並べてカテゴリ別リスト化
  • ログデータ → エラーだけ抽出・日時順に並べ・種類別に分類
タイトルとURLをコピーしました