在Scala中,将函数应用于不可变映射中某些键的值

时间:2014-04-23 10:57:53

标签: scala collections

让一个不可变的地图

val m = (0 to 3).map {x => (x,x*10) }.toMap
m: scala.collection.immutable.Map[Int,Int] = Map(0 -> 0, 1 -> 10, 2 -> 20, 3 -> 30)

感兴趣的键集合

val k = Set(0,2)

和一个功能

def f(i:Int) = i + 1

如何将f应用于感兴趣的键映射的地图中的值,以便生成的地图

Map(0 -> 1, 1 -> 10, 2 -> 21, 3 -> 30)

3 个答案:

答案 0 :(得分:6)

m.transform{ (key, value) => if (k(key)) f(value) else value }

答案 1 :(得分:1)

这是我脑子里浮现的第一件事,但我很确定在Scala你可以做得更漂亮:

m.map(e =>  {
    if(k.contains(e._1)) (e._1 -> f(e._2)) else (e._1 -> e._2)
})  

答案 2 :(得分:0)

@ regis-jean-gilles使用map和模式匹配的答案

m.map { case a @ (key, value) => if (k(key)) key -> f(value) else a }