首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“基于地图的回忆录”在Java8?

“基于地图的回忆录”在Java8?
EN

Stack Overflow用户
提问于 2014-10-10 01:49:41
回答 1查看 336关注 0票数 2

在我之前的问题中

无限Fibonacci序列在Java 8中的注释

我问到如何用Java8流的回忆录以简洁的数学方式编写代码来定义斐波纳契的无限序列。

谢天谢地,我得到了答案,下面的代码似乎运行得很好:

代码语言:javascript
复制
    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 5 8 13 21 34 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 121393 317811 514229 832040

尽管Java8中函数的代码样式表示方式仍然让我感到困惑,但我可以相当肯定它对应于fibonacci序列的数学定义。

计算速度表明它回溯了这个函数,他说

您可以拿出基于地图的回忆录斐波纳契(X),并由此产生无限的流:

map-based memoized in Java8是什么?

而且,我无法按照逻辑的角色

.mapToLong(f -> f[0]);

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

EN

回答 1

Stack Overflow用户

发布于 2015-05-27 18:58:24

正如米沙所说,回忆录是“Supplier<Long> 功能接口”,因为它存储了两个私人变量n1n2。然后,该对象具有可变的状态,并具有副作用。它在使用平行化时可能会产生问题。

代码语言:javascript
复制
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]}

代码语言:javascript
复制
.iterate(
        new long[]{1, 1},
        f -> new long[]{f[1], f[0] + f[1]}
        )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26290716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档