关于字典:Scala mapValues懒吗?

Is Scala mapValues lazy?

当我打电话给

1
2
3
4
5
6
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()

在其中fn具有调试打印语句的情况下,我得到以下输出:

1
2
3
4
5
Before
...head item...
After
...debug print statement from fn...
...debug print statement from fn...

我不明白为什么在打印" After"之后为什么要调用调试打印语句,而且我也不明白为什么要两次获取调试打印语句---除非mapValues创建一个惰性映射? >


是的。它映射到一个保存fn的中间类,直到访问(一次又一次)后才求值。

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

如果您不想进行懒惰的评估,请使用严格的map。即:

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


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

如果您提供地图t和函数fn的代码,那么我们也许可以提供帮助。