Skip to content
閲覧中:
2. 中間操作:基本(16-30)

2. 中間操作:基本(16-30)

Java Gold試験において、中間操作は**「遅延評価(Lazy Evaluation)」**という性質が最も重要視されます。つまり、終端操作が呼ばれるまで、これらの中間操作は一切実行されません。

16番から30番までのサンプルコードを、試験で問われやすいポイントと共に解説します。


16-20: フィルタ・ソート

Java
List<String> list = List.of("apple", "banana", "cherry", "apple");

// 16. filter: Predicateがtrueのものだけ残す
list.stream().filter(s -> s.startsWith("a")); // "apple"

// 17. map: 要素を別の型や値に変換する
list.stream().map(String::toUpperCase); // "APPLE", "BANANA"...

// 18. distinct: 重複を排除 (equals/hashCodeを使用)
list.stream().distinct(); // "apple", "banana", "cherry"

// 19. sorted(): 自然順序(辞書順など)でソート
list.stream().sorted(); // "apple", "apple", "banana", "cherry"

// 20. sorted(Comparator): カスタム順序(文字列の長さ順など)
list.stream().sorted(Comparator.comparing(String::length));

21-25: デバッグ・制限・プリミティブ変換

Java
// 21. peek: 要素を変更せずに消費(主にデバッグ用)
// 試験ポイント:終端操作がないと実行されない(何も出力されない)
list.stream().peek(System.out::println).collect(Collectors.toList());

// 22. limit: 先頭からn個に制限
Stream.iterate(1, n -> n + 1).limit(5); // 1, 2, 3, 4, 5

// 23. skip: 先頭からn個を捨てる
list.stream().skip(2); // "cherry", "apple"

// 24. flatMap: 1つの要素をStreamに変換し、それらを1つのStreamに平坦化する
// 例:リストのリストを、単一のリストにする
List<List<String>> nested = List.of(List.of("A"), List.of("B"));
nested.stream().flatMap(l -> l.stream()); // Stream<String> ("A", "B")

// 25. mapToInt / Long / Double: オブジェクトからプリミティブStreamへ
// 試験ポイント:これ以降はsum()やaverage()が使えるようになる
list.stream().mapToInt(String::length); // IntStream

26-30: ボックス化・Java 9+の新機能

Java
IntStream is = IntStream.of(1, 2, 3);

// 26. boxed: プリミティブ(int)からラッパー型(Integer)のStreamへ
Stream<Integer> s26 = is.boxed();

// 27. asDoubleStream: IntStreamなどをDoubleStreamへ(キャスト)
DoubleStream ds = IntStream.range(1, 4).asDoubleStream(); // 1.0, 2.0, 3.0

// 28. mapToObj: プリミティブ値を元に任意のオブジェクトを生成
Stream<String> s28 = IntStream.range(1, 4).mapToObj(i -> "Item" + i);

// 29. takeWhile (Java 9+): 条件がtrueの間だけ取り、falseになったら即終了
// 試験ポイント:limitと違い、"最初の脱落者"が出た時点で打ち切る
Stream.of(1, 2, 4, 3, 2).takeWhile(n -> n < 4); // 1, 2 (4で停止)

// 30. dropWhile (Java 9+): 条件がtrueの間は捨て、一度falseになったらそれ以降を全て取る
Stream.of(1, 2, 4, 3, 2).dropWhile(n -> n < 4); // 4, 3, 2

💡 Java Gold 試験対策の急所:flatMap vs map

試験では flatMap の戻り値の型が頻繁に問われます。

  • map(Function<T, R>): 戻り値は R
  • flatMap(Function<T, Stream<R>>): 戻り値は Stream<R>

flatMap のラムダ式の中で List を返すとコンパイルエラーになります。必ず .stream() を呼んで Stream 型にする必要があります。

💡 takeWhile vs filter の違い

  • filter: 全要素をチェックし、条件に合うものをすべて拾う。
  • takeWhile: 条件に合わない要素が1つでも出たら、残りの要素が条件に合っていても処理を中断する。(無限ストリームを安全に処理できる)

次は、いよいよ結果を出す「終端操作(31-45)」のコードを確認しますか?