対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-829 対応
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  }
  1. Afa fb fc fd ma mb mc md A B C D
  2. Bfa ma A fb mb B fc mc C fd md D
  3. CA B C D
  4. Dfa ma fb mb fc mc fd md A B C D
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:BGold監修

解説

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 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
Stream API を含む全問を分野別に演習できます(無料)。
演習する →