我尝试使用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)生成列表时,而元组(r3)则生成Map。甚至强制类型也不起作用(r2)。只有显式调用Seq才可以(r4)。所以我的问题是,为什么/如何Map.map“自动”创建一个新的Map而不是例如列表呢?实际上返回类型是如何确定的(Seq,List等)
m.toList
有什么问题?另外需要注意的是,在集合上进行映射(mapping)会返回相同类型的另一个集合,因此你无法直接返回一个映射在Map
上的列表,除非你对其调用.toList
。 - Ende Neu