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 の挙動を整理し、自信を持って選べるようにしておきましょう。