Java Gold SE11対策:Stream中間操作を極める!試験に出る使い方とポイントまとめ

アイキャッチ画像

Java Gold SE11では、Stream APIの中間操作に関する理解が深く問われます。特に map() や filter() だけでなく、sorted() や distinct() など「一見わかりにくい操作」の本質が問われることも多く、しっかりとした準備が必要です。

本記事では、中間操作の代表的なメソッドをコード付きで整理し、試験で狙われやすい引っかけポイントや違いも合わせて解説します。

中間操作とは?

中間操作とは、「Streamを変換・加工する操作」であり、新たなStreamを返す操作です。

Streamの中間操作はすべて「遅延評価(lazy evaluation)」され、終端操作が呼ばれるまで実行されません

中間操作の代表的なメソッド

1. map()

要素を変換する基本操作。Function<T, R> と一緒に使う。

List<String> names = List.of(“Java”, “Stream”);

List<Integer> lengths = names.stream()

    .map(String::length)

    .collect(Collectors.toList()); // [4, 6]

✅ 試験ポイント:

  • 戻り値の型が変わる(T → R)
  • Function型と連携しているかどうかを確認

2. filter()

条件に一致する要素だけを残す操作。Predicate<T> を使う。

List<Integer> numbers = List.of(1, 2, 3, 4, 5);

List<Integer> even = numbers.stream()

    .filter(n -> n % 2 == 0)

    .collect(Collectors.toList()); // [2, 4]

✅ 試験ポイント:

  • 戻り値の型は変わらない(T → T)
  • boolean を返す条件式が必要

3. sorted()

要素をソート。自然順か、Comparator<T> を指定。

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

List<String> sorted = words.stream()

    .sorted()

    .collect(Collectors.toList()); // [apple, banana, cherry]

カスタム順序:

List<String> byLength = words.stream()

    .sorted(Comparator.comparing(String::length))

    .collect(Collectors.toList()); // [apple, banana, cherry]

✅ 試験ポイント:

  • Comparator の使い方とメソッド参照に慣れておくこと
  • Comparable 実装があるか確認

4. distinct()

重複を除去する操作。equals() と hashCode() に依存。

List<String> items = List.of(“A”, “B”, “A”, “C”);

List<String> noDup = items.stream()

    .distinct()

    .collect(Collectors.toList()); // [A, B, C]

✅ 試験ポイント:

  • Set ではないが、Set と同様に重複排除する
  • equalsとhashCodeが正しく実装されていないと機能しない

5. limit(n) / skip(n)

件数制限やスキップ処理。

List<Integer> limited = List.of(1, 2, 3, 4, 5).stream()

    .limit(3)

    .collect(Collectors.toList()); // [1, 2, 3]

List<Integer> skipped = List.of(1, 2, 3, 4, 5).stream()

    .skip(2)

    .collect(Collectors.toList()); // [3, 4, 5]

✅ 試験ポイント:

  • skip → limit の順で使うと効果が変わることに注意
  • limit(0) や skip(0) も動作確認

6. peek()

主にデバッグ用途。forEachの代わりに使うのはNG!

List<String> result = List.of(“a”, “b”, “c”).stream()

    .peek(System.out::println)  // 途中確認用

    .map(String::toUpperCase)

    .collect(Collectors.toList());

✅ 試験ポイント:

  • peek() は中間操作 → 終端操作がなければ実行されない
  • forEachの代用には使わない

stateless vs stateful の違い

区分メソッド特徴
statelessmap, filter, peek要素ごとに独立して処理
statefulsorted, distinct, limit, skip他の要素と関係しながら処理

✅ 試験では、「statefulな操作が含まれているとパフォーマンスに影響する」といった記述に注意!

試験対策チェック

チェック項目理解度
map と filter の違いを説明できるか
sorted で Comparator を使えるか
distinct が equals/hashCode に依存する理由
peek() がデバッグ用であることを理解

おわりに

Stream APIの中間操作は、「宣言型スタイル」でコードの意図を明確に表現できる強力なツールです。Java Goldの試験では、操作の種類だけでなく、戻り値や副作用、評価タイミングなど細かな部分が問われます。