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 }
- A
true改行0 - B
false改行0 - C
falseの後に例外がスローされる - D
NoSuchElementExceptionがスローされる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓Gold監修
解説
reduce には複数のオーバーロードがある。
1引数版 reduce(BinaryOperator) は初期値を持たないため、空ストリームでは「結果なし」を表す
空の Optional を返す(isPresent() は false)。
一方 2引数版 reduce(identity, accumulator) は identity(初期値)を持つため、
空ストリームではそのidentityをそのまま返す。よって r2 は 0。
identity を持つか否かで、空入力時の戻り(Optional か 値そのもの)が分かれるのが要点。- A1引数版は空ストリームで空Optionalを返すので
isPresent()はtrueでなくfalse。 - Cどちらの行も例外を投げない。1引数版は空Optionalを返すだけ、2引数版はidentityを返すだけ。
- D
reduceは空でも例外を投げない(NoSuchElementExceptionはOptional.get()を空に対して呼んだ場合などの話)。
ひっかけ: 「reduceは合計だから空なら0」と一括りにする。identityの有無で戻り型と空入力時挙動が変わる。
実機確認の答え合わせ
出力: false 0
✓Gold 保有者による書き下ろし解説・実機で検証済