2010-07-16 116 views
2

2.7我能做到以下幾點:斯卡拉2.8和地圖視圖

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

我找不到2.8這樣做的方式,實際上與地圖結束了:

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

這似乎是一個重大的功能喪失,因此我認爲它隱藏在某處的集合庫中。有人有主意嗎?

編輯 - 愚蠢我假定mapValues完全相同作爲舊mapElements

回答

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 
+5

這不完全「懶「(對每個關鍵點進行零或一個評估,並且儘可能延遲這些評估),這更像是」動態「,因爲每次在得到的地圖視圖中檢索關鍵字時,對mapValues調用中提供的函數進行評估* *。 – 2010-07-16 16:56:48

+0

是的,這就是我的意思。我不應該使用懶惰 – 2010-07-16 17:04:10

+0

這個詞我建議說「mapValues返回一個視圖」。 – 2010-07-16 17:43:49