scala - Scala 是否有惰性评估包装器?

标签 scala lazy-evaluation

我想为我只想计算一次且仅在实际使用结果时计算的结果返回一个包装器/容器。像这样的东西:

def getAnswer(question: Question): Lazy[Answer] = ???

println(getAnswer(q).value)

使用 lazy val 应该很容易实现:

class Lazy[T](f: () => T) {
  private lazy val _result = Try(f())

  def value: T = _result.get
}

但我想知道标准 API 中是否已经包含了类似的东西。

指向 Streams 的快速搜索和 DelayedLazyVal但两者都不是我想要的。

Streams 确实内存了流元素,但似乎第一个元素是在构造时计算的:

def compute(): Int = { println("computing"); 1 }

val s1 = compute() #:: Stream.empty
// computing is printed here, before doing s1.take(1)

类似地,DelayedLazyVal 在构建时开始计算,甚至需要执行上下文:

val dlv = new DelayedLazyVal(() => 1, { println("started") })
// immediately prints out "started"

最佳答案

scalaz.Need,我认为您可以使用它。

关于scala - Scala 是否有惰性评估包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32218573/

相关文章:

performance - 改进 Scala 脚本启动时间——客户端模式?

scala - 在另一个 monad 中验证的好语法

scala工作表用spark抛出错误

list - scala 根据元素类型将列表拆分为子列表

scala - 如何创建 map 数据集?

scala - 用Filter代替过滤器

stream - Ocaml:懒惰列表

python - Python 中的内存交换时间

scala - 如何让 Scalaz ZIO 变得懒惰?

c# - 是否可以缓存 IEnumerable 惰性评估结果?