では、「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)
);
Java1️⃣ 目的の処理
- 年齢 ≥ 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);
Java3️⃣ 処理パイプライン図(直感理解用)
[入力リスト: 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️⃣ ポイント解説
| ステップ | メソッド | 何をするか |
|---|---|---|
| 1 | filter() | 条件に合う要素だけ残す(年齢25以上) |
| 2 | map() | 各要素を変換(名前を大文字化) |
| 3 | sorted() | 名前順に並び替え |
| 4 | groupingBy() + mapping() | 部署ごとに社員名をまとめる |
- 矢印の流れで「左から右へ処理が順に流れる」と考えると分かりやすい
collect()内でまとめる処理は Stream パイプラインの最後 に書く
5️⃣ 視覚的覚え方
INPUT -> filter -> map -> sorted -> groupingBy -> OUTPUT
- filter → 選ぶ
- map → 変える
- sorted → 並べる
- groupingBy → まとめる
この順番を覚えておくと、Stream API の複雑な処理も直感的に理解できます。
💡 実務例:
- 社員データ → 部署別・年齢条件付きの名簿作成
- 商品データ → 売上高条件で抽出・名前順に並べてカテゴリ別リスト化
- ログデータ → エラーだけ抽出・日時順に並べ・種類別に分類


