Stream.iterate是Java 8引入的惰性无限流生成方法,支持双参数(seed+f)和Java 9三参数(seed+hasNext+next)版本,适用于斐波那契、等差/等比数列、自然数、日期递推等规则序列,需limit或终止条件截断,要求函数无状态且确定性。

Stream.iterate 是 Java 8 引入的用于创建惰性求值、无限流(或有限流)的静态工厂方法,适合按规则生成序列,比如斐波那契数列、等差/等比数列、自然数、日期递推等。
基本用法:两个参数版本(推荐初学使用)
语法:Stream.iterate(T seed, UnaryOperator<T> f)
- seed:起始元素(第一个元素)
- f:函数,输入上一个元素,输出下一个元素
- 该重载会**无限生成**:seed → f(seed) → f(f(seed)) → …
⚠️ 注意:直接打印或收集会死循环,必须配合 limit() 或 takeWhile()(Java 9+)截断:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
// 生成前 5 个偶数:0, 2, 4, 6, 8
Stream.iterate(0, n -> n + 2)
.limit(5)
.forEach(System.out::println);
带终止条件的三参数版本(Java 9+)
语法:Stream.iterate(T seed, Predicate<T> hasNext, UnaryOperator<T> next)
立即学习“Java免费学习笔记(深入)”;
- seed:起始值
- hasNext:判断是否继续生成(对当前元素返回 true 才产出并计算下一个)
- next:生成下一个元素的函数
- 此版本自动终止,无需额外 limit
示例:生成小于 10 的奇数
Stream.iterate(1, n -> n < 10, n -> n + 2)
.forEach(System.out::println); // 输出:1 3 5 7 9
常见实用场景
-
自然数序列:
Stream.iterate(1, n -> n + 1) -
斐波那契数列(元组模拟):用
new long[]{0,1}为 seed,每次生成new long[]{b, a+b},再 map 提取首项 -
日期递推:从某天开始,每天加 1 天(
LocalDate::plusDays) -
幂次序列:如 2⁰, 2¹, 2²… →
Stream.iterate(1, n -> n * 2)
注意事项
- 生成的是有序、不可变、无限流,不支持并行优化(除非显式调用
parallel(),但多数场景无意义) - 函数
f必须是**无状态、确定性**的;若含副作用(如修改外部变量),行为不可预测 - 避免在
next函数中抛异常,否则流提前中断且可能难以调试 - 与
Stream.generate不同:iterate 依赖前一项,generate 完全独立(适合随机数、UUID 等)

















