在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 }