Java Gold SE11対策:mapとfilterだけじゃない!Stream中間操作の正しい使い方

アイキャッチ画像

Java Gold SE11の試験では、Stream APIの中間操作に関する理解が深く問われます。特にmapやfilterだけでなく、sortedやdistinctなどの操作、peekのようなデバッグ用操作まで知っておくことで、コード選択問題や動作理解問題で差がつきます。

この記事では、中間操作の種類とその正しい使い方をまとめ、試験に出やすいミスや引っかけポイントも解説します。

1. 中間操作と終端操作の違い

  • 中間操作(intermediate operation):Streamを返す。繋げて使う(パイプライン構築)
  • 終端操作(terminal operation):Streamを閉じて結果を得る。これが実行されるまで中間操作は「実行されない」

List<String> list = List.of(“apple”, “banana”, “cherry”);

list.stream()

    .filter(s -> s.length() > 5) // 中間操作(実行されない)

    .forEach(System.out::println); // 終端操作(ここで初めて実行される)

重要! → forEach や collect が来るまでは「何も起きていない」

2. よく使う中間操作

map(Function)

  • 要素を変換する操作
  • Function<T, R> を使って、T型 → R型に変換

List<String> list = List.of(“java”, “gold”);

List<Integer> lengths = list.stream()

    .map(String::length)

    .collect(Collectors.toList());

filter(Predicate)

  • 条件に合う要素だけを残す
  • Predicate<T> を使ってtrueの要素だけ通す

list.stream()

    .filter(s -> s.length() >= 5)

sorted()

  • 自然順または Comparator 指定で並び替える

list.stream().sorted(); // 自然順

list.stream().sorted(Comparator.reverseOrder()); // 逆順

distinct()

  • 重複要素を除去(equals/hashCodeを使用)

Stream.of(“a”, “b”, “a”)

    .distinct() // → “a”, “b”

peek(Consumer)

  • 要素を「のぞき見る」だけの操作(デバッグ用)
  • forEachとの違いに注意! → peekは中間操作

list.stream()

    .peek(System.out::println)

    .collect(Collectors.toList()); // peekだけでは出力されない

3. 試験で狙われやすいポイント

❌ mapで戻り値を返さない

list.stream()

    .map(s -> System.out.println(s)) // NG:戻り値void(型合わない)

mapは「変換」用 → 必ず戻り値が必要

❌ filterでboolean以外を返す

list.stream()

    .filter(s -> s.length()) // NG:int型はPredicateにならない

filterは「条件」用 → boolean が必要!

❌ sorted/distinctで副作用が起きる

sorted() や distinct() は「stateful操作」=全要素を一時的に保持して処理を行う
→ 要素数が多い場合に注意されるべき

list.stream()

    .sorted() // → 内部で一旦全要素を保持する必要がある

4. 中間操作は再利用できない

一度終端操作が実行されたStreamは再利用できません!

Stream<String> stream = list.stream();

stream.filter(s -> s.length() > 5).count();

stream.forEach(System.out::println); // IllegalStateException

使い捨て → 新しいStreamを作る

まとめチェックリスト

  • ✅ map → 戻り値で変換。voidにしない
  • ✅ filter → booleanを返す条件式
  • ✅ sorted, distinct → stateful操作
  • ✅ peek は中間操作、forEach は終端操作
  • ✅ Streamは1回きり → 終端操作後は再利用不可
  • ✅ 終端操作が実行されるまで、処理は実行されない

おわりに

Java Gold SE11試験では、こうしたStream中間操作の正確な理解が問われます。特に、メソッドの戻り値型や実行タイミング、中間操作の特性(stateless / stateful)などがコード選択問題で出題されやすく、文法を「なんとなく」で覚えていると高確率でミスします。

本記事で紹介した map, filter, sorted, distinct, peek の挙動を整理し、自信を持って選べるようにしておきましょう。