将 scala 映射值与列表进行比较,并返回列表中不存在的键的默认值

cod*_*532 1 dictionary hadoop scala data-science

我试图将 Scala HashMap 的键与值列表进行比较,如果列表中不存在该键,我需要将 Map 的值更新为默认值 -1。

例如:考虑以下情况:

列表:

val pos = List("100","110")
Run Code Online (Sandbox Code Playgroud)

地图:

scala> idSizeMap
res2: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363, 120 -> 1825405636, 130 -> 2194234, 72 -> 3685020648)
Run Code Online (Sandbox Code Playgroud)

使用filterKeys我可以做类似交集的操作

scala> val result = idSizeMap.filterKeys(pos.contains)
result: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363)
Run Code Online (Sandbox Code Playgroud)

但我也希望旧地图中的键具有默认值 -1。预期输出:

Map(100 -> 4240070722, 110 -> 611884363, 120 -> -1, 130, -1, 72 -> -1)
Run Code Online (Sandbox Code Playgroud)

我还尝试了以下操作,它执行与 filterKeys 相同的操作:

var similarItems = Map[String, Long]()
similarItems: scala.collection.immutable.Map[String,Long] = Map()

scala> for (eachpos <- pos) {
     |   if (!eidSizeMap.contains(eachpos)) similarItems += (eachpos -> -1)
     |   else
     |   similarItems += (eachpos -> eidSizeMap(eachpos))
     | }

scala> similarItems
res8: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363)
Run Code Online (Sandbox Code Playgroud)

实现这一目标最合适的 Scala 方法是什么?

Mar*_*lic 5

考虑transform

idSizeMap.transform((k, v) => if (pos.contains(k)) v else -1)
Run Code Online (Sandbox Code Playgroud)

它可能会稍微短一些,因为键未转换。