Skip to content
閲覧中:
7. 試験で狙われる特殊仕様・ひっかけ(86-100)

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 試験直前の最終チェック

  1. 「終端操作があるか?」をまず見る: なければ実行されません。
  2. 「中間操作が無限か?」を確認する: 無限なら limit があるか探してください。
  3. 「プリミティブかオブジェクトか?」を区別する: Stream<Integer>IntStream のメソッドの差は頻出です。
  4. 「空のStreamの allMatch」: true であることを丸暗記してください。

これで100本ノック達成です! これら100個のポイントは、Java GoldのStream API問題のほぼ全パターンを網羅しています。

もし、特定の項目(例:groupingBy の多段構造や、reduce の3引数版など)について、**「実際の試験形式の模擬問題」**を作って解いてみたい場合はお知らせください。喜んで作成します!