ここでは Java の Stream API の「よく使う構文」一覧 を、
初心者にも分かりやすく「何ができるか」「どう書き換えるか」「実務での使いどころ」付きでまとめます。
Stream API のよく使う構文一覧(map / filter / sorted / groupingBy など)
| メソッド | 目的 | 使用例 | 実務での使いどころ |
|---|---|---|---|
filter() | 条件に合う要素だけ残す | list.stream().filter(x -> x > 10) | 条件付き抽出(例:売上100以上だけ集計) |
map() | 各要素を変換する | list.stream().map(String::toUpperCase) | データ変換(例:文字列を大文字化、オブジェクト→別型) |
sorted() | 並び替える | list.stream().sorted() または sorted(Comparator.comparing(User::getAge)) | 並び順の制御(例:日付順・スコア順など) |
forEach() | 各要素に処理を実行 | list.stream().forEach(System.out::println) | 出力、ロギング、DB登録など副作用を許容する処理 |
collect() | Stream を結果(List / Map / Set など)に変換 | .collect(Collectors.toList()) | 結果をまとめたいとき(List などに戻す) |
distinct() | 重複を除去 | list.stream().distinct() | 重複排除(例:ユーザーID一覧) |
limit() | 先頭から指定件数だけ取得 | list.stream().limit(5) | ページング処理・プレビュー表示など |
skip() | 指定件数をスキップ | list.stream().skip(10) | ページング処理の2ページ目以降など |
count() | 要素数を数える | list.stream().count() | 件数確認(例:条件に合うデータ件数) |
anyMatch() / allMatch() / noneMatch() | 条件一致の判定 | list.stream().anyMatch(x -> x > 0) | フラグ判定(例:未処理データがあるか) |
findFirst() / findAny() | 最初(または任意)の1件を取得 | list.stream().findFirst() | 先頭のデータだけ必要なとき |
groupingBy() | グループ分け(集計) | Collectors.groupingBy(User::getDept) | 部署ごと集計・カテゴリ分けなど |
flatMap() | ネストされたリストをフラット化 | list.stream().flatMap(List::stream) | List<List> → List にしたいとき |
例:for文 → Stream への書き換え比較
before(拡張for文)
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> upperNames = new ArrayList<>();
for (String name : names) {
if (name.length() > 3) {
upperNames.add(name.toUpperCase());
}
}
System.out.println(upperNames); // [ALICE, CHARLIE]
Javaafter(Stream API)
List<String> upperNames = names.stream()
.filter(name -> name.length() > 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperNames); // [ALICE, CHARLIE]
Java🧩 解説
filter():条件で絞り込みmap():変換collect():Listに戻す
実務ベストプラクティス
| 観点 | 推奨方法 | 理由 |
|---|---|---|
| 副作用(外部変更) | forEach() 内で変数を変更しない | 並列処理で予期せぬ動作を防ぐ |
| null安全 | Optional.ofNullable(list).orElse(Collections.emptyList()) | null安全な Stream 化 |
| 可読性重視 | 3段階(filter → map → collect)に揃える | 処理の意図が伝わりやすい |
| パフォーマンス | .parallelStream() は要注意 | 小規模データでは逆に遅くなる場合あり |
応用例:groupingBy + 集計
Map<String, Long> deptCount = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment, Collectors.counting()));
deptCount.forEach((dept, count) ->
System.out.println(dept + " 部署: " + count + "人"));
Java👀 例の意味
groupingBy(Employee::getDepartment)→ 部署ごとに分類counting()→ 件数をカウント
実務でよく使う組み合わせ例
| パターン | Stream構文例 | 用途 |
|---|---|---|
| 絞り込み+変換 | .filter(...).map(...) | 条件つき加工 |
| グループ化+集計 | .collect(groupingBy(..., counting())) | 部署別人数など |
| ソート+出力 | .sorted(...).forEach(...) | 並べ替えて一覧表示 |
| 平坦化+変換 | .flatMap(...).map(...) | 二重配列の一括処理 |
