Stream(3引数 iterate=有限ストリーム)難易度 標準無料
次のコードの出力として正しいものを選べ。
1 import java.util.stream.*;
2 public class Q8 {
3 public static void main(String[] a) {
4 Stream.iterate(1, n -> n <= 16, n -> n * 2)
5 .forEach(System.out::print);
6 }
7 }
- A
124816 - B
12481632 - C
1248 - D無限ループ(
limitが無いため終わらない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
Stream.iterate には2種類ある。
- 2引数版
iterate(seed, next):無限ストリーム。limit等で止めないと終わらない。 - 3引数版
iterate(seed, hasNext, next)(Java 9 で追加):述語 hasNext が false になった時点で終了する有限ストリーム。for文(for(i=seed; hasNext; i=next))に相当。
本問は3引数版。述語 n <= 16 は各要素を出す前に評価される:
1(1<=16 ✓ 出力) → 2 ✓ → 4 ✓ → 8 ✓ → 16(16<=16 ✓ 出力) → 次は 32(32<=16 ✗ 終了)。
よって出力は 1 2 4 8 16 を連結した 124816(print なので区切り無し)。
- B
32は述語32 <= 16が偽なので出力されない(生成前に打ち切られる)。 - C境界は
n <= 16(以下)なので16も含まれる。<(未満)と取り違えた誤り。 - Dこれは3引数版
iterate(Java 9)。述語hasNextが終了条件になるので有限で止まる。無限になるのは2引数版。
ひっかけ: 2引数
iterate(無限)と3引数 iterate(Java 9・有限)を混同すると「無限ループする」を選ぶ。境界 n <= 16 は「以下」なので 16 も出力に含まれる(< なら 8 まで)。実機確認の答え合わせ
出力: 124816
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)