Scala有内置缓存吗Class
Is there a Scala Built-In Cache Class
Scala 中是否有像 MemoryCache class 这样的内置内存缓存方式,可以在没有任何额外依赖的情况下用于具有大小限制的简单 LRU 缓存?我发现了很多可能性,但它们都需要外部依赖。
标准库中没有专门为内存缓存构建的内容,但可以很容易地推出自己的缓存。
// memoize this function (arity 1)
def memo1[A,R](f: A=>R): (A=>R) =
new collection.mutable.WeakHashMap[A,R] {
override def apply(a: A) = getOrElseUpdate(a,f(a))
}
使用 WeakHashMap
的原因是它旨在在内存不足的环境中删除(忘记)很少访问的元素。
所以这可以用来缓存(记忆)现有的 methods/functions...
def s2l(s :String) :Long = ???
val s2lM = memo1(s2l) //memoize this String=>Long method
val bigNum :Long = s2lM(inputString) //common inputs won't be recalculated
...或者你可以直接定义函数逻辑。
//memoized Long-to-Double calculation
val l2dM = memo1{ n:Long =>
//Long=>Double code goes here
}
对于元数较大的函数,使用元组作为 Map
键。
def memo3[A,B,C,R](f :(A,B,C)=>R) :(A,B,C)=>R = {
val cache = new collection.mutable.WeakHashMap[(A,B,C),R]
(a:A,b:B,c:C) => cache.getOrElseUpdate((a,b,c), f(a,b,c))
}
Scala 中是否有像 MemoryCache class 这样的内置内存缓存方式,可以在没有任何额外依赖的情况下用于具有大小限制的简单 LRU 缓存?我发现了很多可能性,但它们都需要外部依赖。
标准库中没有专门为内存缓存构建的内容,但可以很容易地推出自己的缓存。
// memoize this function (arity 1)
def memo1[A,R](f: A=>R): (A=>R) =
new collection.mutable.WeakHashMap[A,R] {
override def apply(a: A) = getOrElseUpdate(a,f(a))
}
使用 WeakHashMap
的原因是它旨在在内存不足的环境中删除(忘记)很少访问的元素。
所以这可以用来缓存(记忆)现有的 methods/functions...
def s2l(s :String) :Long = ???
val s2lM = memo1(s2l) //memoize this String=>Long method
val bigNum :Long = s2lM(inputString) //common inputs won't be recalculated
...或者你可以直接定义函数逻辑。
//memoized Long-to-Double calculation
val l2dM = memo1{ n:Long =>
//Long=>Double code goes here
}
对于元数较大的函数,使用元组作为 Map
键。
def memo3[A,B,C,R](f :(A,B,C)=>R) :(A,B,C)=>R = {
val cache = new collection.mutable.WeakHashMap[(A,B,C),R]
(a:A,b:B,c:C) => cache.getOrElseUpdate((a,b,c), f(a,b,c))
}