Эта страница содержит описание метода использования карты getOrElseUpdate
:
object WithCache{
val cacheFun1 = collection.mutable.Map[Int, Int]()
def fun1(i:Int) = i*i
def catchedFun1(i:Int) = cacheFun1.getOrElseUpdate(i, fun1(i))
}
Итак, вы можете использовать catchedFun1
, который будет проверять, содержит ли cacheFun1
ключ и возвращаемое значение, связанные с ним. В противном случае он вызовет fun1
, затем кеш fun1
приведет к cacheFun1
, а затем вернет результат fun1
.
Я вижу одну потенциальную опасность - cacheFun1
может стать большим. Так что cacheFun1
нужно как-то очистить сборщик мусора?
P.S. Что насчет scala.collection.mutable.WeakHashMap and java.lang.ref.*
?