Stream.iterate()是Java 8引入的创建无限流的静态方法,支持两参数(seed+f)和Java 9新增的三参数(seed+hasNext+next)版本,适用于递推序列、索引生成等场景,需配合limit()等终止操作以防死循环。

Stream.iterate() 是 Java 8 引入的静态工厂方法,用于创建一个**无限流(infinite stream)**,从指定初始值开始,按给定的“种子 → 下一项”规则反复生成元素。它适合模拟递推序列、生成索引、构造测试数据等场景。
基本用法:两个参数版本
最常用的是 Stream.iterate(T seed, UnaryOperator:
- seed:起始值(第一个元素)
-
f:函数,输入当前项,输出下一项(如
x -> x + 1)
例如生成自然数序列:
Stream.iterate(0, n -> n + 1)
.limit(5)
.forEach(System.out::println); // 输出:0 1 2 3 4
⚠️ 注意:这个流是无限的,必须用 limit()、takeWhile() 等终止操作,否则 forEach 会死循环。
带条件终止的三参数版本(Java 9+)
Java 9 增加了更安全的重载:Stream.iterate(T seed, Predicate
-
hasNext:判断是否继续生成(返回
true才生成下一项) - next:生成下一项的函数
例如生成小于 10 的偶数:
Stream.iterate(0, x -> x x + 2)
.forEach(System.out::println); // 输出:0 2 4 6 8
这个版本在每次迭代前先检查条件,天然避免无限循环风险,推荐优先使用。
常见实用场景
-
生成斐波那契数列:用对象封装前两项,或用
long[]数组传递状态 -
生成日期序列:起始
LocalDate,用plusDays(1)推进 - 构造测试数据:如生成用户 ID("user-1", "user-2", ...)
-
模拟指数增长:如
Stream.iterate(1, x -> x * 2).limit(10)
注意事项
- 不支持并行流的高效分割(因为无明确大小),并行时性能可能不如
IntStream.range() - 迭代函数必须是无状态的;若依赖外部变量或修改共享状态,结果不可预测
- 若
next函数抛异常,流会在对应位置中断 - 与
Stream.generate()不同:iterate()有明确前后依赖关系,generate()每次独立调用 Supplier
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











