1Z0-826-JPN 対応
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
✓ 正解:B✓有資格者監修

解説

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 
✓有資格者(著者)による書き下ろし解説

有資格者(著者)が監修した問題は、すべて無料サンプルとして公開しています。買う前に、その全部を実際に解いて解説まで読めます。有料で追加される問題はAIが作成したもので、有資格者の監修は入っていません。

この問題集の作り方

  1. 問題と解説はAIが作成しています。有資格者(著者)が監修した問題は、無料サンプルとして公開している分だけです。有料で追加される問題に監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 解説に載せているコンパイル結果は、実際に javac を走らせた出力です。想定した挙動ではありません。
  5. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  6. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
Stream API を含む問題を分野別に演習できます。
演習する →