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()要素数を返すlongintと間違えないように
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の試験でも確実に得点できます。