Mohan Mohan - 2 months ago 21
Scala Question

Is Scala mapValues lazy?

When I call

System.err.println("Before")
System.err.flush()
val foo: Map[Int, T] = t mapValues (fn(_))
System.err.println(foo.head) //prevent optimiser from delaying the construction of 'foo'
System.err.println("After")
System.err.flush()


with
fn
having a debug print statement inside, I get this output:

Before
...head item...
After
...debug print statement from fn...
...debug print statement from fn...


I don't understand why the debug print statements are being called after "After" is printed, and I don't understand why I'm getting it twice --- unless
mapValues
creates a lazy map?

m-z m-z
Answer

Yes it is. It maps to an intermediate class that holds fn and doesn't evaluate until access (again and again).

def mapValues[W](f: V => W): Map[K, W] = new MappedValues(f)

Use a strict map if you don't want lazy evaluation. That is:

collection map { case (k, v) => (k, fn(v)) }