首页 > 解决方案 > Scala Map - 使用 map 函数替换键->值

问题描述

我想更改键的键和值,key1并且key2仅当它们的值是val1and时val2(这两个映射都应该存在以进行转换)。我可以使用以下代码来做到这一点,但我认为这不是非常优雅或高效。

有没有更好的方法来做同样的事情,也许只使用一个.map应用于map的函数?

代码:

val map = Map(
  "key1" -> "val1",
  "key2" -> "val2",
  "otherkey1" -> "otherval1"
)

val requiredKeys = List("key1", "key2")

val interestingMap = map.filterKeys(requiredKeys.contains) // will give ("key1" -> "val1", "key2" -> "val2").

val changedIfMatched =
  if (interestingMap.get("key1").get.equalsIgnoreCase("val1") && interestingMap.get("key2").get.equalsIgnoreCase("val2"))
    Map("key1" -> "newval1", "key2" -> "newval2")
  else
    interestingMap

print(map ++ changedIfMatched) // to replace the old key->values with the new ones, if any.

++更新旧映射的操作也可以key->value更有效吗?

标签: scala

解决方案


这是一种检查两个键值对是否匹配的方法。

编辑:mapValues向类添加了一个方法Map。此技术可用于对地图的值进行进一步检查。

val m = Map("key1" -> "val1", "key2" -> "VAL2", "otherkey1" -> "otherval1")
val oldKVs = Map("key1" -> "val1", "key2" -> "val2")
val newKVs = Map("newkey1" -> "newval1", "newkey2" -> "newval2")

implicit class MapImp[T,S](m: Map[T,S]) {
  def mapValues[R](f: S => R) = m.map { case (k,v) => (k, f(v)) }
  def subsetOf(m2: Map[T,S]) = m.toSet subsetOf m2.toSet
}

def containsKVs[T](m: Map[T,String], sub: Map[T,String]) =
  sub.mapValues(_.toLowerCase) subsetOf m.mapValues(_.toLowerCase)

val m2 = if (containsKVs(m, oldKVs)) m -- oldKVs.keys ++ newKVs else m

println(m2)
// Map(otherkey1 -> otherval1, newkey1 -> newval1, newkey2 -> newval2)

它利用了您可以将Maps转换为Sets of的事实Tuple2


推荐阅读