我尝试使用 Map.map 将 map 转换为元组列表。 然而这失败了。我做了以下实验:
val m = Map(("a" -> 1), ("b" -> 2))
//> m : scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)
val r1 = m.map{ case (k,v) => v} //> r1 : scala.collection.immutable.Iterable[Int] = List(1, 2)
def toTuple[A,B](a:A,b:B) = (a,b) //> toTuple: [A, B](a: A, b: B)(A, B)
//val r2: List[Tuple2[_,_]] = m.map(e => (e._1,e._2))
val r3 = m.map(e => toTuple(e._1,e._2)) //> r3 : scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)
val r4 = m.toSeq //> r4 : Seq[(String, Int)] = ArrayBuffer((a,1), (b,2))
请注意如何为单个元素 (r1) 生成 List,但如何为元组 (r3) 生成 Map。甚至不强制类型有效(r2)。只有对 Seq 的显式调用才做到这一点(r4)所以我的问题是,为什么/如何 Map.map “自动”创建一个新的 Map 而不是列表?实际上返回类型是如何确定的(Seq、List等)
最佳答案
一个Map
已经是元组的集合。
scala> "b" -> 2
res0: (String, Int) = (b,2) // Implicitly converted to a Tuple
当您映射Map
时,您正在映射它包含的(键,值)对。这是行不通的,因为你要去掉键,只保留值。所以你拥有的不再是 Map
,但在集合层次结构中向上一两步,即 Iterable
:
val r1 = m.map{ case (k,v) => v}
强制类型无法工作,因为 Map[A, B]
不是List[(A, B)]
。这相当于 m.map(identity)
。请注意您如何访问 e
使用元组访问器:
val r2: List[Tuple2[_,_]] = m.map(e => (e._1,e._2))
val r3 = m.map(e => toTuple(e._1,e._2))
在这里,Seq
比 List
更通用:
val r4 = m.toSeq
@EndeNeu 所说的简单解决方案就是使用 toList
。当你 map
一个集合,如果可以的话,它应该返回原始集合类型。所以映射一个Map
应该返回另一个Map
,除非底层结构使其不再是 Map
(就像完全删除键一样)在 r1
中.
关于list - Scala:将 Map 映射到元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769367/