述語付きStream.iterate()
述語でイテレーションを停止する — ストリーム形式のforループ。
コード比較
✕ Java 8
Stream.iterate(1, n -> n * 2)
.limit(10)
.forEach(System.out::println);
// can't stop at a condition
✓ Java 9+
Stream.iterate(
1,
n -> n < 1000,
n -> n * 2
).forEach(IO::println);
// stops when n >= 1000
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
自然な終了
任意の上限ではなく条件で停止します。
forループ相当
for(seed; hasNext; next)と同じセマンティクスです。
無限ストリームのリスクなし
述語が終了を保証します。
旧来のアプローチ
iterate + limit
モダンなアプローチ
iterate(シード, 述語, 操作)
JDKバージョン
9
難易度
中級
JDKサポート
述語付きStream.iterate()
利用可能
JDK 9(2017年9月)以降、広く利用可能
仕組み
3引数のStream.iterate(seed, hasNext, next)はforループのように動作します。seedが開始値、hasNextが停止条件、nextが次の値を生成します。
関連ドキュメント