2014-03-25 34 views
13

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

回答

11

你基本上要求缓存。 您可能会使用scalaz.Memo,它会将记忆添加到给定的函数中。 见http://eed3si9n.com/learning-scalaz/Memo.html

这将使类似:但是,你得到的是功能,而不是一个地图

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

注意。这意味着您无法测试是否存在给定的密钥,您只能申请。 但是,如果我相信你的例子,在你的情况下,这正是你想要的。

8

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

虽然你应该将该类包装到另一个类中,否则稍后任何有该地图引用的人都可以更改该值。

+0

我觉得必须有一种方法来做到这一点没有可变的地图.... – Daniel