如何基于模式匹配替换Scala中一个Map的值为另一个Map的值?
解决Scala Map匹配替换并过滤的问题
我来帮你搞定这个需求~其实用Scala的集合操作就能轻松实现,这里有两种直观的写法,都能达到你想要的效果:
方法一:使用flatMap
这是比较简洁的写法,利用flatMap自动过滤掉None结果的特性:
val lookupMap = Map("aaa" -> "apple", "bbb" -> "orange", "ccc" -> "banana") val entriesMap = Map("foo" -> "ccc", "bar"-> "aaa", "baz" -> "zzz") val result = entriesMap.flatMap { case (key, value) => // 用entriesMap的值去lookupMap里查,返回Option[String] lookupMap.get(value).map(newValue => key -> newValue) }
逻辑拆解:
entriesMap.flatMap:遍历每个键值对,并且自动展开Option类型的结果——如果是Some就保留里面的内容,是None就直接忽略。lookupMap.get(value):因为Map.get方法返回Option,找到匹配的键就返回Some(对应值),没找到就返回None。- 对
Option调用map:把找到的新值和原键组合成新的键值对,变成Option[(String, String)],最后被flatMap收集成最终的Map。
方法二:使用for推导式
如果觉得flatMap有点绕,用for推导式会更直观,逻辑和上面完全等价,Scala会自动把它转换成flatMap的组合:
val result = for { // 遍历entriesMap的每个键值对 (key, value) <- entriesMap // 只有当lookupMap里能找到对应值时,才继续执行 newValue <- lookupMap.get(value) } yield key -> newValue
运行结果
两种方法得到的result都是:
Map("foo" -> "banana", "bar" -> "apple")
完全符合你的预期,"baz"因为在lookupMap里找不到匹配的键,被自动过滤掉了。
内容的提问来源于stack exchange,提问作者jjaguirre394
相关产品推荐
相关产品推荐

