scala - Scala Map - 使用 map 函数替换键->值
问题描述
我想更改键的键和值,key1
并且key2
仅当它们的值是val1
and时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
更有效吗?
解决方案
这是一种检查两个键值对是否匹配的方法。
编辑: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)
它利用了您可以将Map
s转换为Set
s of的事实Tuple2
。
推荐阅读
- aws-lambda - 为什么 pymysql conn.close() 执行 CORS 错误?
- firebase - 没有切换帐户的“已存在具有相同电子邮件地址的帐户”
- python - 如何选择特定的行和列
- cdi - CDI事件和EJB TransactionAttribute的组合
- workflow - qbo3 文档审核工作流程
- fullcalendar - 事件工具提示未在 FullCalendar 中显示
- react-native - 在 React Native 的 FlatList 中动态调整字体大小
- spring-boot - Spring Boot 在启动时替换应用程序属性
- c++ - STD c++ 使用查找函数设置
- javascript - 将 jQuery 重构为 vanila JS 以进行自定义选择