Lazily评估了索引序列类型

mis*_*tor 9 collections scala lazy-evaluation scala-collections

我需要构建一个从外部资源加载的对象序列.这种负载是昂贵的操作需要延迟到需要对象的时间.构建集合后,我需要对包含的对象进行索引访问.Scala标准库是否提供适合此用例的集合?如果没有,实施它的最佳方式是什么?

编辑:
索引查找最好是O(1)操作.

huy*_*hjl 10

奇怪的是,Miles最近发布了关于此的推文.然后回复指出了需要 在年底 Name.scala的scalaz和另外一个点,规范LazyParameter.

很少测试需要:

import scalaz._
import Scalaz._
val longOp = { var x = 0; () => {println("longOp"); x += 1; x }}
val seq = Seq(Need(longOp()), Need(longOp()))
val sum = seq.map(_.value).sum
val sum = seq.map(_.value).sum

val v = Need(longOp())
val s = v.map("got " + _)
println(s.value)
println(s.value)
Run Code Online (Sandbox Code Playgroud)

打印:

longOp: () => Int = <function0>
seq: Seq[scalaz.Name[Int]] = List(
  scalaz.Name$$anon$2@1066d88, scalaz.Name$$anon$2@1011f1f)
longOp
longOp
sum: Int = 3
sum: Int = 3
v: scalaz.Name[Int] = scalaz.Name$$anon$2@133ef6a
s: scalaz.Name[java.lang.String] = scalaz.Name$$anon$2@11696ec
longOp
got 3
got 3
Run Code Online (Sandbox Code Playgroud)

所以longOp只在第一次访问值时调用一次.


Nic*_*las 5

据我所知,标准库中没有任何东西适合.解决方案可能是为您的对象使用一种Lazy包装器:

class Lazy[A](operation: => A) {
  lazy val get = operation
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以Collection[Lazy[A]使用您想要使用的任何类型的集合来构建您的.