19

Just like Stream is a lazy Seq, is there a lazy version of Map?

What I want to do:

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

2 Answers 2

13

You are basically asking for a cache. You might have a shot at using scalaz.Memo, which adds memoization to a given function. See http://eed3si9n.com/learning-scalaz/Memo.html

This would give something like:

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

Note however that what you get is a function, not a map. This means that you cannot test for the presence or absence of a given key, you can only apply. But if I am to trust your example, in your case this is exactly what you want.

Sign up to request clarification or add additional context in comments.

Comments

12

mutable.Map provides the method getOrElseUpdate(key: A, op: ⇒ B): B. You could use that to implement lazy semantics.

You should wrap the class in another class though, because else the value can be changed later by anyone who has the reference to that map.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.