【问题标题】:Is there a Scala Built-In Cache Class是否有 Scala 内置缓存类
【发布时间】:2018-05-29 20:34:05
【问题描述】:

在 Scala 中是否有一种内置的内存缓存方式,例如 MemoryCache 类,可以在没有任何附加依赖项的情况下用于具有大小限制的简单 LRU 缓存?我发现了很多可能性,但它们都需要外部依赖。

【问题讨论】:

  • java.util.LinkedHashMap 可以配置为按 LRU 顺序驱逐。

标签: scala caching memorycache


【解决方案1】:

标准库中没有专为内存缓存而构建的任何内容,但您可以轻松实现自己的目标。

// 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 的原因是它旨在丢弃(忘记)内存挑战环境中很少访问的元素。

所以这可以用来缓存(记忆)现有的方法/功能......

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2016-09-03
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多