Scala mapValues是懒惰吗?

Moh*_*han 8 mapping dictionary scala lazy-evaluation

我打电话的时候

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()
Run Code Online (Sandbox Code Playgroud)

fn里面有一个调试打印语句,我得到这样的输出:

Before
...head item...
After
...debug print statement from fn...
...debug print statement from fn...
Run Code Online (Sandbox Code Playgroud)

我不明白为什么在打印"After"之后调用调试打印语句,我不明白为什么我得到它两次---除非mapValues创建一个懒惰的地图?

Mic*_*jac 12

是的.它映射到一个中间类,该中间类fn在访问(一次又一次)之前保持并且不进行评估.

def mapValues[W](f: V => W): Map[K, W] = new MappedValues(f)
Run Code Online (Sandbox Code Playgroud)

map如果您不想进行延迟评估,请使用严格.那是:

collection map { case (k, v) => (k, fn(v)) }
Run Code Online (Sandbox Code Playgroud)


Eri*_*ger 8

请记住,MappedValues实现会在每次访问时评估函数 - 与lazy val仅评估一次的Scala不同.单步执行代码时,您可能会看到输出两次.扩展val foo调试器窗口将迭代值,调用函数fn并生成调试输出.

如果您提供地图t和功能的代码fn,那么我们可能会提供帮助.