在我之前的问题中
Infinite Fibonacci Sequence with Memoized in Java 8
我问如何编写一个代码,用简洁的数学方式定义斐波纳契的无限序列,并使用Java8 Stream进行记忆。
谢天谢地,我有一个答案,下面的代码似乎运作良好:
LongStream fibs = Stream
.iterate(
new long[]{1, 1},
f -> new long[]{f[1], f[0] + f[1]}
)
.mapToLong(f -> f[0]);
fibs
.limit(30)
.forEach(System.out::println);
1 1 2 3 五 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
虽然Java8中函数的代码样式表示仍然让我感到困惑,但我可以公平地确认它对应于fibonacci序列的数学定义。
计算速度表明它会记住这个功能,他说
你可以拍摄基于地图的memoized fibonacci(x),然后像这样制作一个无限的流:
Java8中的map-based memoized
是什么?
另外,我无法遵循
的逻辑角色 .mapToLong(f -> f[0]);
你能解释一下吗?任何参考/文件也不胜感激。感谢。
答案 0 :(得分:0)
正如Misha所说,它是Supplier<Long>
functional interface的备忘,因为它存储了两个私有变量n1
和n2
。该对象具有 可变 状态并具有副作用。使用并列化时可能会出现问题。
new Supplier<Long>() {
private long n1 = 1;
private long n2 = 2;
@Override
public Long get() {
long fibonacci = n1;
long n3 = n2 + n1;
n1 = n2;
n2 = n3;
return fibonacci;
}
}
相反,具有iterate
的解决方案是不可变的,并且已准备好进行并行化。它生成一个大小为2的long
数组流,从[1,1]开始并迭代应用函数f -> new long[]{f[1], f[0] + f[1]}
.iterate(
new long[]{1, 1},
f -> new long[]{f[1], f[0] + f[1]}
)