Scala Map Cache Method

  • getOrElseUpdate特别适合用于访问用作缓存的映射(Map)。假设调用函数f开销巨大:
1
2
3
4
5
6
scala> def f(x: String) = {
println("taking my time.")
Thread.sleep(100)
x.reverse
}
f: (x: String)String

此外,再假设f没有副作用,即反复以相同参数调用f,得到的结果都相同。那么,我们就可以将之前的调用参数和计算结果保存在一个映射(Map)内,今后仅在映射中查不到对应参数的情况下实际调用f,这样就可以节约时间。这个映射便可以认为是函数f的缓存。

1
2
val cache = collection.mutable.Map[String, String]()
cache: scala.collection.mutable.Map[String,String] = Map()

现在,我们可以写出一个更高效的带缓存的函数f:

1
2
3
scala> def cachedF(s: String) = cache.getOrElseUpdate(s, f(s))
cachedF: (s: String)String
scala> cachedF("abc")

稍等片刻。

1
2
3
res3: String = cba
scala> cachedF("abc")
res4: String = cba