対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-829 対応
Stream API / Optional難易度 高無料

次のコードの出力として正しいものを選べ。

1  import java.util.*;
2  import java.util.stream.*;
3  public class Q4 {
4      public static void main(String[] args) {
5          Optional<Integer> r1 = Stream.<Integer>of().reduce((a, b) -> a + b);
6          System.out.println(r1.isPresent());
7
8          int r2 = Stream.<Integer>of().reduce(0, (a, b) -> a + b);
9          System.out.println(r2);
10     }
11 }
  1. Atrue 改行 0
  2. Bfalse 改行 0
  3. Cfalse の後に例外がスローされる
  4. DNoSuchElementException がスローされる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:BGold監修

解説

reduce には複数のオーバーロードがある。 1引数版 reduce(BinaryOperator) は初期値を持たないため、空ストリームでは「結果なし」を表す 空の Optional を返す(isPresent()false)。 一方 2引数版 reduce(identity, accumulator)identity(初期値)を持つため、 空ストリームではそのidentityをそのまま返す。よって r20。 identity を持つか否かで、空入力時の戻り(Optional か 値そのもの)が分かれるのが要点。
各誤答が違う理由
  • A1引数版は空ストリームで空Optionalを返すので isPresent()true でなく false
  • Cどちらの行も例外を投げない。1引数版は空Optionalを返すだけ、2引数版はidentityを返すだけ。
  • Dreduce は空でも例外を投げない(NoSuchElementExceptionOptional.get() を空に対して呼んだ場合などの話)。
ひっかけ: 「reduceは合計だから空なら0」と一括りにする。identityの有無で戻り型と空入力時挙動が変わる。
実機確認の答え合わせ
出力:
false
0
Gold 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
Stream API を含む全問を分野別に演習できます(無料)。
演習する →