可使用Stream.iterate()构建斐波那契数列流:以long[]{0,1}为种子,迭代函数生成新数组{prev[1], prev[0]+prev[1]},再map提取首项并limit截取前n项;支持BigInteger防溢出,且必须用limit或takeWhile等终止无限流。

可以使用 Stream.iterate() 从初始状态出发,按规则不断生成下一个元素,从而构建斐波那契数列流。关键在于把“一对相邻项”作为种子,每次用它们推导出下一项,并滑动窗口。
用二元元组作为状态载体
斐波那契依赖前两项,所以不能只传一个数字,而应传 new long[]{0, 1} 这样的数组(或自定义容器),让迭代函数基于当前两项计算下一项:
- 起始种子:
new long[]{0, 1} - 迭代函数:
prev -> new long[]{prev[1], prev[0] + prev[1]} - 这样每一步都得到新的
[Fₙ, Fₙ₊₁],流中每个元素是长度为 2 的数组
提取首项并截取有限项
由于我们关心的是数列本身(即每个 Fₙ),需用 map 提取每对中的第一个值;再用 limit(n) 截取前 n 项:
Stream.iterate(new long[]{0, 1},
prev -> new long[]{prev[1], prev[0] + prev[1]})
.map(pair -> pair[0])
.limit(10)
.forEach(System.out::println); // 输出前10个斐波那契数:0,1,1,2,3,5,8,13,21,34
避免整数溢出(可选增强)
当项数较大时,long 会溢出。若需更大范围,可改用 BigInteger:
- 种子:
new BigInteger[]{BigInteger.ZERO, BigInteger.ONE} - 迭代函数:
prev -> new BigInteger[]{prev[1], prev[0].add(prev[1])} - 后续
map和limit逻辑不变
注意终止条件与无限流特性
iterate() 默认生成无限流,必须显式调用 limit()、takeWhile() 等中间操作来截断,否则终端操作(如 forEach)会无限执行。例如按值大小截断可写:
.takeWhile(f -> f <p>这会输出所有 ≤1000 的斐波那契数(0,1,1,2,...,987)。</p>











