基于Lambda表达式的斐波那契数列代码逻辑解析请求
这段Lambda实现斐波那契数列的逻辑详解
先把你的代码贴出来:
Stream.iterate(new Long[] {0L, 1L}, p -> new Long[] {p[1], p[0]+p[1]}).map(p -> p[0]);
咱们拆成两部分一步步拆解逻辑:
1. Stream.iterate:生成迭代的数组流
Stream.iterate是Java 8用来生成无限有序流的方法,它需要两个核心参数:
- 初始种子:这里是
new Long[] {0L, 1L},对应斐波那契数列的前两个起始数; - 迭代函数:
p -> new Long[] {p[1], p[0]+p[1]},这个Lambda的作用是用当前数组生成下一组迭代的基础数据。
手动模拟每一轮迭代的变化:
- 初始数组:
[0, 1] - 第一次迭代:基于初始数组
p,生成新数组[p[1], p[0]+p[1]]→[1, 0+1=1] - 第二次迭代:基于数组
[1,1],生成新数组[1, 1+1=2] - 第三次迭代:基于数组
[1,2],生成[2, 1+2=3] - 第四次迭代:基于数组
[2,3],生成[3, 2+3=5] - ...以此类推,每一轮迭代都会产出一个包含「待输出的数列项」和「下一项计算依据」的数组。
2. map(p -> p[0]):提取斐波那契数列的每一项
map操作负责转换流中的元素,这里的p -> p[0]就是把每一轮迭代生成的数组的第一个元素提取出来,作为最终流的输出项。
对应上面的迭代过程,提取出的元素依次是:
0 → 1 → 1 → 2 → 3 → 5... 正好是标准的斐波那契数列顺序。
注意:这个流是无限流,实际使用时必须用limit(n)限制输出项数,比如要打印前10项:
Stream.iterate(new Long[] {0L, 1L}, p -> new Long[] {p[1], p[0]+p[1]}) .map(p -> p[0]) .limit(10) .forEach(System.out::println);
内容的提问来源于stack exchange,提问作者João Victor
相关产品推荐
相关产品推荐

