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

函数式编程:Java中的自引用列表(斐波那契),java,functional-programming,lazy-evaluation,fibonacci,Java,Functional Programming,Lazy Evaluation,Fibonacci,在Java中实现自引用惰性列表版本以计算斐波那契数时,我遇到了以下问题: LazyList<Long> fibs = new LazyList<>(0L, () -> new LazyList<>(1L, () -> fibs.zip(fibs.getTail()).map(p -> p.getA() + p.getB()) ) ); LazyList fibs=新的LazyList(0L, ()->新懒汉

在Java中实现自引用惰性列表版本以计算斐波那契数时,我遇到了以下问题:

LazyList<Long> fibs = new LazyList<>(0L,
    () -> new LazyList<>(1L,
        () -> fibs.zip(fibs.getTail()).map(p -> p.getA() + p.getB()) 
    )
);
LazyList fibs=新的LazyList(0L,
()->新懒汉名单(1L,
()->fibs.zip(fibs.getTail()).map(p->p.getA()+p.getB())
)
);
有关完整代码,请参阅。惰性列表按需计算值,并缓存这些值以供以后重用

它在第二个lambda中抱怨“fibs可能没有初始化”。虽然我认为我理解它为什么会抱怨,并且有一个解决办法(在要点中,使用setter作为尾部),但我正在寻找一个解决方案

  • 使用与外部世界不可变的接口工作(因此懒散列表上没有setter!)
  • 不会完全改变懒惰列表(实际上是Scala的流)的概念
我知道例如(最后一种方法)。虽然这样做很好,但我想为带有记忆和自引用的惰性评估制定一个示例,这里介绍的Java流解决方案没有


我试图将这个示例从Scala移植到Java:

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


JVM无法将未初始化的引用传递到lambda中。引用未初始化,因为构造函数调用可能失败-与方法调用相同。Scala允许这种情况,因为生成的合成类实现了“属性”FIB而不是变量。很好的发现:一些旧的Scala编译器也不允许这种情况,并声明类似“非法转发引用”(旧bug)的内容。在Java中,可以使用类似中间类或工厂方法的属性,这与Scala编译器的功能相同——只是更难看:)

dzone是惰性计算的一个示例。Scala Fibonacci
(惰性)。计算值被缓存(记忆)以备将来参考:
val fibs:Stream[Long]=0#:::fibs.scan(1L)(+)
val
更改为
def
以关闭记忆。@Oleg right:)。我在这里增加了一点精确性,我想要自我参照和记忆。