Java Gold SE11対策:Java Stream終端操作 完全マスター:違い・使い分け・試験頻出パターン

Java Gold SE11の試験では、Stream APIの「終端操作(terminal operation)」が頻出です。
特に collect() と reduce() の違いや、forEach() の副作用、count() などの処理がどう使われるかが狙われます。
この記事では、終端操作の代表的なメソッドについて、コード例付きで比較しながら整理し、試験に出るポイントを網羅的に解説します。
目次
終端操作とは?
Streamの処理を完了させ、最終的な結果を返す操作です。
終端操作が呼び出されると、それまでの中間操作がすべて評価され、Streamは再利用不可になります。
よく使う終端操作とその特徴
1. forEach()
各要素に処理を適用する。副作用がある処理(print など)に使われがち。
List.of(“A”, “B”, “C”).stream()
.forEach(System.out::println);
✅ 試験ポイント:
- forEach() は終端操作 → peek()との違いに注意
- 並列処理時(parallelStream())では順序が保証されない
2. collect()
StreamをコレクションやMapなどに変換するための操作。最も柔軟性が高い。
List<String> upper = List.of(“a”, “b”, “c”).stream()
.map(String::toUpperCase)
.collect(Collectors.toList()); // [A, B, C]
✅ よく使うCollectors:
- toList() / toSet() / toMap()
- joining():文字列結合
- groupingBy():グループ化
- partitioningBy():条件で2分割
✅ 試験ポイント:
- Collectors はユーティリティクラス
- Collectorの構造(supplier, accumulator など)も試験範囲に含まれる
3. reduce()
値を1つに集約する操作。合計・最大値・連結などに使う。
int sum = List.of(1, 2, 3).stream()
.reduce(0, Integer::sum); // 6
✅ 初期値の有無に注意:
Optional<Integer> sumOpt = List.of(1, 2, 3).stream()
.reduce(Integer::sum);
→ 初期値なしの場合、戻り値は Optional<T>
✅ 試験ポイント:
- 初期値がある場合:その型がそのまま返る
- 初期値がない場合:Optionalでラップされる
- collect() との違い:「値を1つにまとめたいとき」は reduce、「コレクションにしたいとき」は collect
4. count()
要素数を long 型で返す。
long cnt = List.of(“a”, “b”, “c”).stream().count(); // 3
✅ 試験ポイント:
- long 型で返る点に注意(int型と間違えやすい)
- 空Streamでも0が返る
5. 条件チェック系(allMatch, anyMatch, noneMatch)
Predicate を使って、条件に合うかどうかを判定する終端操作。
boolean allEven = List.of(2, 4, 6).stream()
.allMatch(n -> n % 2 == 0); // true
boolean hasOdd = List.of(2, 4, 6).stream()
.anyMatch(n -> n % 2 != 0); // false
✅ 試験ポイント:
- allMatch:すべて満たす
- anyMatch:いずれか1つ満たす
- noneMatch:すべて満たさない
- 短絡評価(short-circuiting)される(早期に結果が確定したら残りの要素は処理しない)
6. findFirst() / findAny()
要素を1つ返す。戻り値は Optional<T>。
Optional<String> first = List.of(“a”, “b”, “c”).stream()
.findFirst(); // Optional[a]
Optional<String> any = List.of(“a”, “b”, “c”).parallelStream()
.findAny(); // 並列処理時は順序保証なし
✅ 試験ポイント:
- findFirst() は順序ありStream向け
- findAny() は parallelStream() 時に高速になることも
終端操作まとめ表
メソッド | 概要 | 戻り値 | 試験ポイント |
forEach() | 各要素に処理適用 | void | 副作用あり。順序保証に注意 |
collect() | コレクション等に変換 | 任意(List等) | Collector構造を理解 |
reduce() | 値を1つに集約 | T or Optional<T> | 初期値の有無で戻り値が変わる |
count() | 要素数を返す | long | intと間違えないように |
allMatch() 等 | 条件を満たすか評価 | boolean | 短絡評価される |
findFirst/Any() | 1要素を返す(Optional) | Optional<T> | 並列処理時の動作に注意 |
再利用不可の落とし穴
Stream<String> stream = List.of(“A”, “B”).stream();
stream.count(); // OK
stream.forEach(System.out::println); // IllegalStateException!
✅ 試験でも「終端操作後のStreamを再利用しているコード」がよく出題されます。
おわりに
Stream APIの終端操作は、結果を得るための「ゴール」です。
ただ使い方を覚えるだけでなく、初期値の有無・戻り値の違い・副作用の注意点を押さえておくことで、Java Gold SE11の試験でも確実に得点できます。