Эта страница содержит описание метода использования карты 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.*?