7. 試験で狙われる特殊仕様・ひっかけ(86-100)
いよいよ最後、合格を分ける**「Stream APIの落とし穴」**です。Java Gold試験では、コードは一見正しく見えても、実行時に例外が発生したり、何も出力されなかったりするパターンが好んで出題されます。
86番から100番まで、試験でそのまま出る可能性の高いポイントを解説します。
86-90: Streamの特性とソートの罠¶
Java
// 86. Streamの再利用不可 (IllegalStateException)
Stream<String> s = Stream.of("A", "B").filter(x -> true);
s.count();
// s.collect(Collectors.toList()); // ← 2回目の終端操作は例外!
// 87. 遅延評価 (何も出力されない)
// 終端操作がないため、peekの中身は実行されない
Stream.of("A").peek(System.out::println);
// 88. プリミティブ特有のメソッド
// sum(), average() は IntStream, LongStream, DoubleStream にしかない
// Stream<Integer> に sum() はないので、mapToInt が必要
int sum = Stream.of(1, 2).mapToInt(i -> i).sum();
// 89. 関数型IFの不一致
// filter は Predicate (T -> boolean) を受け取る。
// (s -> s.length()) のように数値を返すとコンパイルエラー
// 90. Comparatorの連結
// Comparator.comparing(...).thenComparing(...) の連鎖で
// ジェネリクスが推論できずコンパイルエラーになる場合がある((User u) -> ... と明示が必要)
91-95: 特殊な状態と計算¶
Java
// 91. 空のStreamに対するallMatch
boolean res = Stream.empty().allMatch(x -> false); // true! (反証がないため)
// 92. nullを含むStreamのソート
// nullが含まれるStreamを自然順序でソートすると NullPointerException
// Stream.of("A", null).sorted().collect(Collectors.toList());
// 93. 無限Streamのソート (停止しない)
// 制限(limit)なしで sorted() を呼ぶと、全要素の確定を待って無限ループになる
// Stream.iterate(0, i -> i + 1).sorted();
// 94. flatMapの戻り値はStream型
// stream.flatMap(list -> list) はNG。 stream.flatMap(list -> list.stream()) が正解
// 95. reduceの初期値(identity)
// reduce(identity, accumulator) の初期値は、計算の「中立元」であること
// 加算なら0、乗算なら1。でないと並列時に結果が狂う
96-100: 副作用・型推論・配列¶
Java
// 96. 副作用の禁止
// Stream内で外部変数を書き換えない (final または実質的finalである必要あり)
int[] count = {0};
Stream.of(1, 2).forEach(i -> count[0] += i); // 動作はするが推奨されない試験のNG例
// 97. peekは要素を加工できない
// peek(s -> s.toUpperCase()) としても、元の要素は変わらない(mapが必要)
// 98. IntStream.max() の戻り値
// Optional<Integer> ではなく OptionalInt を返す
OptionalInt max = IntStream.of(1, 10).max();
// 99. toMapの重複例外
// map.putのように上書きされず、キーが重複すると IllegalStateException
// 回避には (oldVal, newVal) -> newVal のような第3引数が必要
// 100. Arrays.stream vs Stream.of
int[] nums = {1, 2, 3};
System.out.println(Arrays.stream(nums).count()); // 3 (IntStream)
System.out.println(Stream.of(nums).count()); // 1 (Stream<int[]>)
💡 Java Gold 試験直前の最終チェック¶
- 「終端操作があるか?」をまず見る: なければ実行されません。
- 「中間操作が無限か?」を確認する: 無限なら
limitがあるか探してください。 - 「プリミティブかオブジェクトか?」を区別する:
Stream<Integer>とIntStreamのメソッドの差は頻出です。 - 「空のStreamの allMatch」:
trueであることを丸暗記してください。
これで100本ノック達成です! これら100個のポイントは、Java GoldのStream API問題のほぼ全パターンを網羅しています。
もし、特定の項目(例:groupingBy の多段構造や、reduce の3引数版など)について、**「実際の試験形式の模擬問題」**を作って解いてみたい場合はお知らせください。喜んで作成します!