有没有“懒惰的地图”?

时间:2014-03-25 15:07:58

标签: scala

就像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

2 个答案:

答案 0 :(得分:11)

你基本上要求缓存。 您可能会使用scalaz.Memo,这会为给定的函数添加memoization。 见http://eed3si9n.com/learning-scalaz/Memo.html

这会产生类似的结果:

val lm: Int => String = Memo.mutableHashMapMemo[Int, String] { a =>
  println("only once")
  (a * a).toString()
}

但请注意,你得到的是一个功能,而不是地图。这意味着您无法测试给定密钥的存在与否,您只能申请。 但如果我相信你的榜样,在你的情况下,这正是你想要的。

答案 1 :(得分:10)

mutable.Map提供了方法getOrElseUpdate(key: A, op: ⇒ B): B。您可以使用它来实现惰性语义。

你应该把这个类包装在另一个类中,因为否则后来任何有这个地图引用的人都可以改变这个值。