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