`Java8中基于地图的记忆?

`Java8中基于地图的记忆?,java,dictionary,functional-programming,java-8,java-stream,Java,Dictionary,Functional Programming,Java 8,Java Stream,在我前面的问题中 我问过如何编写一个代码,用Java8流的memonization以简洁的数学方式定义fibonacci的无限序列 谢天谢地,我得到了一个答案,下面的代码似乎工作得很好: LongStream fibs = Stream .iterate( new long[]{1, 1}, f -> new long[]{f[1], f[0] + f[1]} )

在我前面的问题中

我问过如何编写一个代码,用Java8流的memonization以简洁的数学方式定义fibonacci的无限序列

谢天谢地,我得到了一个答案,下面的代码似乎工作得很好:

    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. 2. 3. 5. 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中函数的代码样式表示仍然让我感到困惑,但我可以相当肯定它符合斐波那契序列的数学定义

他说,计算速度表明它可以记忆函数

您可以使用基于地图的记忆斐波那契(x)并从中生成无限流,如下所示:

在Java8中,什么是基于地图的记忆

而且,我无法理解

.mapToLong(f->f[0])


你能解释一下吗。如有任何参考/文件,也将不胜感激。谢谢。

正如米莎所说,之所以要记录的是
供应商
,因为它存储了两个私有变量
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;
    }
}

我想你误解了你引用的评论。它指的是
IntStream.iterate(1,i->i+1).mapToLong(i->fibonacci(i)).iterate(
        new long[]{1, 1},
        f -> new long[]{f[1], f[0] + f[1]}
        )