函数式编程:Java 中的自引用列表(斐波那契)

Functional programming: Self-referencing list in Java (Fibonacci)

在实现自引用惰性列表版本以计算 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 might not have been initialized"。虽然我想我理解它为什么抱怨并有一个解决方法(在要点中,尾部使用 setter),但我正在寻找一个解决方案

我知道,例如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 允许这种情况,因为生成了合成的 classed 来实现 "property" fib 而不是变量。不错的发现:一些旧的 Scala 编译器也不允许这种情况,并声明类似 "illegal forward reference"(旧错误)。使用 Java,人们可以使用类似于 属性 的中间体 class 或工厂方法,它与 Scala 编译器的作用相同——只是更难看:)