Java8中的“基于地图的memoized”?

时间:2014-10-10 01:49:41

标签: java dictionary functional-programming java-8 java-stream

在我之前的问题中

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]);

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

1 个答案:

答案 0 :(得分:0)

正如Misha所说,它是Supplier<Long> functional interface的备忘,因为它存储了两个私有变量n1n2。该对象具有 可变 状态并具有副作用。使用并列化时可能会出现问题。

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]}
        )