Stream API難易度 高無料
次のコードの出力として正しいものを選べ。
1 import java.util.stream.*;
2 public class Q3 {
3 public static void main(String[] args) {
4 Stream.of("a", "b", "c", "d")
5 .filter(s -> { System.out.print("f" + s + " "); return true; })
6 .map(s -> { System.out.print("m" + s + " "); return s.toUpperCase(); })
7 .forEach(s -> System.out.print(s + " "));
8 }
9 }
- A
fa fb fc fd ma mb mc md A B C D - B
fa ma A fb mb B fc mc C fd md D - C
A B C D - D
fa ma fb mb fc mc fd md A B C D
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓Gold監修
解説
Stream のパイプラインは「全要素にfilter→次に全要素にmap」という水平処理ではない。
1要素ずつパイプライン全体(filter→map→forEach)を縦に通してから次の要素へ進む(element-at-a-time / 縦方向の処理)。
中間操作は遅延評価され、終端操作
各誤答が違う理由forEach が要素を1つ引くたびに上流が1要素分だけ評価される。
よって "a" が filter→map→forEach を通り(fa ma A)、続いて "b"(fb mb B)… となる。- A全filterを先に走らせる「水平処理」を仮定した誤り。実際は縦方向。
- Cfilter/map 内の
printも実行されるので、f*・m*が出力に現れる。 - Dfilter→map をまとめてから forEach をまとめて、という誤り。forEach も1要素ごとに即実行される。
ひっかけ: 中間操作を「配列のmap/filterのように一括」と捉える。Streamは終端の引きに応じた縦パイプ。
実機確認の答え合わせ
出力(末尾スペースあり): fa ma A fb mb B fc mc C fd md D
✓Gold 保有者による書き下ろし解説・実機で検証済