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

在Scala中,将函数应用于不可变映射中某些键的值,scala,collections,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 -

让我们创建一个不可变的映射

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)

这是我想到的第一件事,但我非常确信,在Scala中,你可以做得更漂亮:

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

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

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

你有一个不可变的地图,为什么你想变异它?您可以这样做:
(m.keySet intersect k).map(e=>(e->f(e)).toMap
?@S.R.I您的解决方案生成
scala.collection.immutable.map[Int,Int]=map(0->1,2->3)
@goral,是的,从映射中添加其他键是另一件小事。:-@goral,提示:您可以在集合上使用
diff
map
。@goral,也就是说:您的输出看起来不正确-如果您将
f
应用到地图
m
,您将得到
地图(0->1,1->10,2->3,3->30)
。不是你所展示的。这有点短,因为else分支中的表达式只是e:m.map(e=>{if(k.contains(e.'u 1))(e.'u 1->f(e.'u 2))else e})我认为如果你使用
transform
而不是
map
,那么做
m.transform{(key,value)如果k(key)=>f(value)}
。。。?否则,您总是只是替换每一对,还不如使用
map
。您的代码片段无法编译。我猜你指的是
大小写(键、值)
,对吗?这也不起作用,因为
转换
不执行
部分函数
。至于您也可以使用
map
,是的,这是肯定的。使用
transform
的唯一好处是不必重复返回值中的键。啊,对不起,我假设
transform
确实像在一些JSON和XML库中一样使用
PartialFunction
。。。我的错。
m.map { case a @ (key, value) => if (k(key)) key -> f(value) else a }