Scala 2.8和Map视图

oxb*_*kes 2 scala lazy-evaluation scala-2.8

2.7我可以做到以下几点:

val lazyM: Map[_, _] = map.projection.mapElements(v => expCalc(v)) //MAP VIEW
Run Code Online (Sandbox Code Playgroud)

我在2.8中找不到这样做的方法,实际上最终得到了一张地图:

val m: Map[_, _] = map.view.map(kv => kv._1 -> expCalc(kv._2)).toMap //STRICT
Run Code Online (Sandbox Code Playgroud)

这似乎是功能的重大损失,因此我认为它隐藏在某个地方的集合库中.有人有主意吗?

编辑 - 愚蠢地我认为mapValues与旧的mapElements完全相同

RM.*_*RM. 7

有点令人惊讶的是,Map#mapValues产生一个(转换的)视图:

scala> Map(1 -> 2, 3 -> 4, 5 -> 6)
res0: scala.collection.immutable.Map[Int,Int] = Map((1,2), (3,4), (5,6))

scala> res0.mapValues { v => println("computing from " + v); v + 1 }
computing from 2
computing from 4
computing from 6
res1: scala.collection.immutable.Map[Int,Int] = Map((1,3), (3,5), (5,7))

scala> res1(1)
computing from 2
res2: Int = 3

scala> res1(5)
computing from 6
res3: Int = 7
Run Code Online (Sandbox Code Playgroud)

  • 这不正是"懒"(每用尽可能长的时间延迟这些评估的关键零和或一个评估),它更像是在调用`mapValues`提供的功能进行评估*每次在关键的"动态"检索生成的Map视图*. (5认同)