就像Stream
是一个懒惰的Seq
,是否有Map
的懒惰版?有没有'懒人地图'?
我想做什么:
val lm = LazyMap[Int, String]((a) => {
println("only once")
(a * a).toString()
})
lm.get(10) // print "only once"
lm.get(10) // print nothing
就像Stream
是一个懒惰的Seq
,是否有Map
的懒惰版?有没有'懒人地图'?
我想做什么:
val lm = LazyMap[Int, String]((a) => {
println("only once")
(a * a).toString()
})
lm.get(10) // print "only once"
lm.get(10) // print nothing
你基本上要求缓存。 您可能会使用scalaz.Memo
,它会将记忆添加到给定的函数中。 见http://eed3si9n.com/learning-scalaz/Memo.html
这将使类似:但是,你得到的是功能,而不是一个地图
val lm: Int => String = Memo.mutableHashMapMemo[Int, String] { a =>
println("only once")
(a * a).toString()
}
注意。这意味着您无法测试是否存在给定的密钥,您只能申请。 但是,如果我相信你的例子,在你的情况下,这正是你想要的。
mutable.Map
提供了方法getOrElseUpdate(key: A, op: ⇒ B): B
。你可以用它来实现惰性语义。
虽然你应该将该类包装到另一个类中,否则稍后任何有该地图引用的人都可以更改该值。
我觉得必须有一种方法来做到这一点没有可变的地图.... – Daniel