基于IndexedSeq的Stream相当于?

时间:2013-04-25 16:17:27

标签: scala

我有一个懒惰计算的对象序列,其中惰性计算仅取决于索引(不是前面的项)和一些常量参数(下面的p:Bar)。我目前正在使用Stream,但计算stream.init通常很浪费。

但是,我真的很喜欢使用Stream[Foo] = ...使我无法实现缓存,并且具有非常轻的声明语法,同时仍提供所有糖(如stream(n)获取元素n) 。然后,我可能只是使用了错误的声明:

class FooSrcCache(p:Bar) {
  val src : Stream[FooSrc] = {
    def error() : FooSrc = FooSrc(0,p)
    def loop(i: Int): Stream[FooSrc] = {
      FooSrc(i,p) #:: loop(i + 1)
    }
    error() #:: loop(1)
  }
  def apply(max: Int) = src(max)
}

是否有Stream - 可比较的基础Scala类,它是索引而不是线性的吗?

1 个答案:

答案 0 :(得分:3)

PagedSeq应该为你完成这项工作:

class FooSrcCache(p:Bar) {
    private def fill(buf: Array[FooSrc], start: Int, end: Int) = {
      for (i <- start until end) {
        buf(i) = FooSrc(i,p)
      }
      end - start
    }

    val src = new PagedSeq[FooSrc](fill _)

    def apply(max: Int) = src(max)
}

请注意,这可能会使用高于您请求的索引来计算FooSrc