Stream.iterate 适合生成斐波那契数列等依赖前项的序列,需用数组或record封装双状态,配合map提取数值,并必须用limit等终止操作避免无限执行。

Stream.iterate 是 Java 8 引入的函数式生成工具,适合按规则无限推导序列,斐波那契数列正是典型应用场景:每一项由前两项决定,天然契合“上一项 → 下一项”的迭代逻辑。
理解 iterate 的签名与核心逻辑
Stream.iterate 的基本形式是:
Stream.iterate(T seed, UnaryOperator
它从 seed 开始,反复将上一个元素传入函数 f,生成下一个元素,形成无限流。
关键点在于:f 必须能用“当前状态”完整表达“下一个状态”。对斐波那契而言,单个数字不够(需要前两项),所以状态必须是封装了两个数的结构,比如 int[] {a, b} 或自定义 Pair。
用 int[] 封装状态生成斐波那契流
以长度为 2 的数组作为状态载体,初始为 {0, 1},每次将 {a, b} 映射为 {b, a + b}:
Stream<int> fibPairs = Stream.iterate(
new int[]{0, 1},
pair -> new int[]{pair[1], pair[0] + pair[1]}
);</int>
要提取斐波那契数值(即每对中的第一个数),可链式映射:
Stream<integer> fib = fibPairs.map(pair -> pair[0]);</integer>
取前 10 项示例:
fib.limit(10).forEach(System.out::println); // 0 1 1 2 3 5 8 13 21 34
用 record 或 Pair 类提升可读性(Java 14+)
比起数组,用不可变 record 更清晰、安全:
record FibPair(int prev, int curr) {
FibPair next() {
return new FibPair(curr, prev + curr);
}
}
生成流更直观:
Stream<fibpair> fibStream = Stream.iterate(
new FibPair(0, 1),
FibPair::next
);</fibpair>
提取数值也更语义化:
fibStream.map(FibPair::curr).limit(10).forEach(System.out::println);
注意终止与性能边界
iterate 生成的是无限流,必须用 limit、takeWhile 等中间操作截断,否则终端操作(如 forEach、collect)会陷入死循环。
另外,iterate 是懒加载的,但每次计算依赖上一次结果,无法并行加速(parallelStream 对 iterate 效果有限),适合顺序、确定性生成场景。
若需随机访问某项(如第 n 项),iterate 不是最佳选择;此时应改用公式或迭代循环——函数式生成强在“按需、声明式、组合灵活”,不在随机索引。











