Есть ли класс встроенного кэша Scala? - PullRequest
0 голосов
/ 29 мая 2018

Существует ли встроенный способ кэширования памяти в Scala, например класс MemoryCache, который можно использовать без каких-либо дополнительных зависимостей для простого кэша LRU с ограничением размера?Я нашел много возможностей, но все они требуют внешних зависимостей.

1 Ответ

0 голосов
/ 30 мая 2018

В стандартной библиотеке нет ничего, специально созданного для кэширования памяти, но достаточно просто свернуть свою собственную.

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