Search code examples
scalacachingmemorycache

Is there a Scala Built-In Cache Class


Is there a built-in way of doing in memory caching in Scala like a MemoryCache class that can be used without any additional dependencies for a simple LRU cache with a size limit? I've found many possibilities but they all require external dependencies.


Solution

  • There's nothing in the Standard Library built specifically for memory caching but it's easy enough to roll your own.

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

    The reason for using WeakHashMap is that it is designed to drop (forget) seldom-accessed elements in a memory-challenged environment.

    So this can be used to cache (memoize) existing 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
    

    ...or you can define the function logic directly.

    //memoized Long-to-Double calculation
    val l2dM = memo1{ n:Long =>
      //Long=>Double code goes here
    }
    

    For functions with larger arity, use a tuple as the Map key.

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