在Scala中交叉并合并/连接两个映射

and*_*nka 4 scala

假设我有两张看起来像这样的地图.

val m1 = Map(1 -> "One", 2 -> "Two", 3 -> "Three")
val m2 = Map(2 -> 2.0, 3 -> 3.0, 4 -> 4.0)
Run Code Online (Sandbox Code Playgroud)

我想基于键获取交集并返回表示合并值的元组.结果看起来像这样.

Map(2 -> (Two,2.0), 3 -> (Three,3.0))
Run Code Online (Sandbox Code Playgroud)

我想我可以诉诸类似的东西

val merged = m1 collect {
  case (key, value) if m2.contains(key) => key -> (value, m2(key))
}
Run Code Online (Sandbox Code Playgroud)

但是,没有"更惯用"的方式吗?我的直觉与我的相似之处Set

val merged = m1.intersect(m2)
Run Code Online (Sandbox Code Playgroud)

jwv*_*wvh 5

m1.keySet.intersect(m2.keySet).map(k => k->(m1(k),m2(k))).toMap
// res0: Map[Int,(String, Double)] = Map(2 -> (Two,2.0), 3 -> (Three,3.0))
Run Code Online (Sandbox Code Playgroud)

获取密钥的交集,然后将map它们转换为新的Map.