gpt4 book ai didi

java - 函数式编程: Self-referencing list in Java (Fibonacci)

转载 作者:行者123 更新时间:2023-12-02 06:05:36 24 4
gpt4 key购买 nike

在用 Java 实现自引用惰性列表版本来计算斐波那契数时,我遇到了这个:

LazyList<Long> fibs = new LazyList<>(0L,
() -> new LazyList<>(1L,
() -> fibs.zip(fibs.getTail()).map(p -> p.getA() + p.getB())
)
);

参见https://gist.github.com/lenalebt/e627e13d034011ac156d44917fe466d3获取完整代码。惰性列表按需计​​算值并缓存它们以供以后重用。

它在第二个 lambda 中提示“fibs 可能尚未初始化”。虽然我认为我理解它为什么提示并有解决方法(要点是,使用尾部 setter ),但我正在寻找一种解决方案

  • 使用与外界的不可变接口(interface)(因此 LazyList 上没有 setter !)
  • 并没有完全改变惰性列表的想法(实际上是来自 Scala 的 Stream)

我知道例如https://dzone.com/articles/do-it-java-8-recursive-and (最后一种方法)。虽然这工作得很好,但我想制定一个带有内存和自引用的惰性求值示例,而 Java-Stream 解决方案中提供的解决方案却没有。

我试图将此示例从 Scala 移植到 Java:http://derekwyatt.org/2011/07/29/understanding-scala-streams-through-fibonacci/

最佳答案

我是线程创建者的同事 - 我们已经讨论过这个问题。

JVM 无法将未初始化的引用传递给 lambda。该引用未初始化,因为构造函数调用可能会失败 - 与方法调用相同。 Scala 允许这种情况,因为生成了综合类来实现“属性”fibs 而不是变量。不错的发现:一些旧的 Scala 编译器也不允许这种情况,并声明诸如“非法前向引用”(旧错误)之类的内容。对于 Java,人们可以使用类似于属性的中间类或工厂方法,这与 Scala 编译器的作用相同 - 只是更丑陋:)

关于java - 函数式编程: Self-referencing list in Java (Fibonacci),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com