3. 終端操作:基本(31-45)
Java Gold試験において、終端操作は「Streamの旅の終わり」です。ここで重要なのは、「戻り値の型(Optionalなのか、longなのか、voidなのか)」**と「短絡評価(途中で処理を終えるか)」**の2点です。
31番から45番までのサンプルコードを解説します。
31-35: 消費・配列・集約¶
Java
List<String> list = List.of("apple", "banana", "cherry");
// 31. forEach: 各要素に対してアクションを実行 (戻り値: void)
list.stream().forEach(System.out::println);
// 32. forEachOrdered: 並列ストリームでも順序を保証して処理
list.parallelStream().forEachOrdered(System.out::println);
// 33. toArray(): Object配列を返す
Object[] objArray = list.stream().toArray();
// 34. toArray(IntFunction): 指定した型の配列を返す
String[] strArray = list.stream().toArray(String[]::new);
// 35. reduce(BinaryOperator): 要素を1つにまとめる (戻り値: Optional)
Optional<String> joined = list.stream().reduce((a, b) -> a + "-" + b);
// 結果: Optional["apple-banana-cherry"]
36-40: 初期値あり集約・収集・判定¶
Java
// 36. reduce(identity, BinaryOperator): 初期値から計算 (戻り値: T型)
// 試験ポイント: 空のStreamでも初期値(0)が返るため、Optionalではない
int sum = Stream.of(1, 2, 3).reduce(0, (a, b) -> a + b); // 6
// 37. collect(Collector): ListやSetなどに変換
List<String> result = list.stream().collect(Collectors.toList());
// 38. min / max: 最小値・最大値を取得 (戻り値: Optional)
Optional<String> max = list.stream().max(Comparator.naturalOrder());
// 39. count(): 要素数を返す (戻り値: long)
long count = list.stream().filter(s -> s.length() > 5).count();
// 40. anyMatch: いずれかが条件に一致するか (短絡評価)
boolean match = list.stream().anyMatch(s -> s.startsWith("a")); // true
41-45: 判定・検索¶
Java
// 41. allMatch: すべてが条件に一致するか (短絡評価)
// 試験ポイント: 空のStreamに対して実行すると、常に true になる
boolean all = list.stream().allMatch(s -> s.length() > 2); // true
// 42. noneMatch: 1つも条件に一致しないか (短絡評価)
// 試験ポイント: 空のStreamに対して実行すると、常に true になる
boolean none = list.stream().noneMatch(s -> s.isEmpty()); // true
// 43. findFirst: 最初の要素を返す (戻り値: Optional)
Optional<String> first = list.stream().findFirst();
// 44. findAny: いずれかの要素を返す (戻り値: Optional)
// 試験ポイント: 並列処理(parallel)の場合、findFirstより高速
Optional<String> any = list.parallelStream().findAny();
// 45. iterator: Streamから従来のイテレータを取得
Iterator<String> it = list.stream().iterator();
💡 Java Gold 試験対策の急所¶
1. 短絡評価(Short-circuiting)¶
anyMatch, allMatch, noneMatch, findFirst, findAny, limit は、結果が確定した時点で残りの要素を調べません。
試験に出る例:
list.stream().peek(System.out::println).anyMatch(s -> true);この場合、最初の1つが出力された時点で終了し、残りの要素に対するpeekは実行されません。
2. Optionalを返すメソッド¶
min, max, findFirst, findAny, そして「初期値なし」の reduce は Optional を返します。対して count や sum(プリミティブ)は数値を返します。この違いは戻り値の型を問う問題で頻出です。
3. allMatch / noneMatch と空のStream¶
試験のひっかけとして有名です。
- **空のStreamに対して
allMatchは常にtrue** - **空のStreamに対して
anyMatchは常にfalse**これは「条件に反するものが1つもない」からtrueと定義されているためです。
次は、試験の最難関である 「Collectorsクラス(46-65)」 (groupingByやtoMapなど)に進みますか?