Is Scala mapValues lazy?

强颜欢笑 提交于 2019-12-17 16:56:17

问题


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?


回答1:


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)) }



回答2:


Keep in mind that the MappedValues implementation evaluates the function on every access -- different from a Scala lazy val that evaluates only once. You might be seeing the output twice when stepping through the code. Expanding the val foo in the debugger window will iterate over the values, calling function fn and generating debug output.

If you provide code for map t and function fn, then we might be able to help.



来源:https://stackoverflow.com/questions/39474314/is-scala-mapvalues-lazy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!