Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a 'lazy map'?

Tags:

scala

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
like image 784
Lai Yu-Hsuan Avatar asked Mar 25 '14 15:03

Lai Yu-Hsuan


1 Answers

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.

like image 75
Régis Jean-Gilles Avatar answered Oct 02 '22 20:10

Régis Jean-Gilles