撰写两张地图

tys*_*njh 5 dictionary scala

Scala中是否有一个函数来组合两个映射,或者flatMap是一种合理的方法吗?

scala> val caps: Map[String, Int] = Map(("A", 1), ("B", 2))
caps: Map[String,Int] = Map(A -> 1, B -> 2)

scala> val lower: Map[Int, String] = Map((1, "a"), (2, "b"))
lower: Map[Int,String] = Map(1 -> a, 2 -> b)

scala> caps.flatMap {
     | case (cap, idx) => Map((cap, lower(idx)))
     | }
res1: scala.collection.immutable.Map[String,String] = Map(A -> a, B -> b)
Run Code Online (Sandbox Code Playgroud)

一些语法糖会很棒!

Tra*_*own 10

如果您知道lower将包含所有值的键caps,您可以使用mapValues:

scala> caps mapValues lower
res0: scala.collection.immutable.Map[String,String] = Map(A -> a, B -> b)
Run Code Online (Sandbox Code Playgroud)

如果您不想要或不需要新的集合,只需要一个映射,那么使用它会更加惯用andThen:

scala> val composed = caps andThen lower
composed: PartialFunction[String,String] = <function1>

scala> composed("A")
res1: String = a
Run Code Online (Sandbox Code Playgroud)

这也假设没有caps未映射的值lower.

  • @tysonjh:你总是可以使用例如`val composed = caps.lift andThen(_ flatMap lower.lift)`,如果你想防止任何一级缺少密钥. (5认同)
  • 不值得添加我自己的答案,但如果有未映射的值,那么:`for {(k,v)< - caps; x < - lower.get(v)}产生k - > x` (2认同)