我想返回一个结果的包装器/持有者,我只想计算一次,并且只有当结果被实际使用时。类似于:
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
但两者都不是我想要的。
流确实对流元素进行了记忆,但似乎第一个元素是在构造时计算的:
def compute(): Int = { println("computing"); 1 }
val s1 = compute() #:: Stream.empty
// computing is printed here, before doing s1.take(1)
以类似的方式,
延迟时间值
在构建时开始计算,甚至需要执行上下文:
val dlv = new DelayedLazyVal(() => 1, { println("started") })
// immediately prints out "started"