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?
Keep in mind that the
MappedValues
implementation evaluates the function on every access -- different from a Scalalazy val
that evaluates only once. You might be seeing the output twice when stepping through the code. Expanding theval foo
in the debugger window will iterate over the values, calling functionfn
and generating debug output.If you provide code for map
t
and functionfn
, then we might be able to help.Yes it is. It maps to an intermediate class that holds
fn
and doesn't evaluate until access (again and again).Use a strict
map
if you don't want lazy evaluation. That is: