Подтвердить что ты не робот

Есть ли "ленивая карта"?

Точно так же, как Stream является ленивым Seq, существует ли ленивая версия Map?

Что я хочу сделать:

val lm = LazyMap[Int, String]((a) => {
  println("only once")
  (a * a).toString()
})
lm.get(10) // print "only once"
lm.get(10) // print nothing
4b9b3361

Ответ 1

В основном вы запрашиваете кеш. Возможно, вы захотите использовать scalaz.Memo, который добавляет memoization к данной функции. См. http://eed3si9n.com/learning-scalaz/Memo.html

Это даст что-то вроде:

val lm: Int => String = Memo.mutableHashMapMemo[Int, String] { a =>
  println("only once")
  (a * a).toString()
}

Обратите внимание, что вы получаете функцию, а не карту. Это означает, что вы не можете проверить наличие или отсутствие данного ключа, вы можете подать заявку. Но если я доверяю вашему примеру, в вашем случае это именно то, что вы хотите.

Ответ 2

mutable.Map предоставляет метод getOrElseUpdate(key: A, op: ⇒ B): B. Вы можете использовать это для реализации ленивой семантики.

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