怎么通过 Stream.iterate() 生成一个斐波那契数列的数据流并进行后续的截取处理
利用Java8的Stream.iterate(),以初始数组[0,1](存储相邻两项)为种子,通过迭代函数生成下一对,再用map提取首项得到斐波那契数列,用limit()或takeWhile()截取有限项。为防止溢出可改用BigInteger。此流式方法非常简洁高效,避免了传统循环或递归的繁琐。
先来看一个经典的面试题:怎么用 Ja va 8 的 Stream.iterate() 生成斐波那契数列,并且还能做后续的截取处理?这事儿其实挺有意思的,因为斐波那契本身就依赖前两项的值,而 iterate() 默认只给一个种子——所以得动点脑筋。

核心思路是:把“一对相邻项”作为整个迭代的状态载体,每次根据这两项推算出下一对,然后滑动窗口往前走。这样一来,每一步生成的都是一个长度为2的数组,索引0是当前的斐波那契数,索引1是下一个。
用二元元组作为状态载体
既然斐波那契数列依赖前两项,那我们就别只传一个数字了——传一个 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 <= 1000)
这样只会输出所有 ≤1000 的斐波那契数(0,1,1,2,...,987),既避免了溢出风险,又不用提前指定项数。灵活又优雅,不是吗?
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。














