use*_*561 12 dictionary scala tuples list seq
我尝试使用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))
Run Code Online (Sandbox Code Playgroud)
注意如何为单个元素(r1)生成List,但为元组(r3)生成Map.甚至不强迫类型工作(r2).只有对Seq的显式调用才能做到(r4)所以我的问题是,为什么/如何"自动"创建一个新的Map而不是列表呢?实际上如何确定返回类型(Seq,List等)
Mic*_*jac 20
A Map
已经是元组的集合.
scala> "b" -> 2
res0: (String, Int) = (b,2) // Implicitly converted to a Tuple
Run Code Online (Sandbox Code Playgroud)
当您映射a时Map
,您将映射它包含的(键,值)对.这不起作用,因为您正在剥离密钥,并仅保留值.所以你拥有的不再是一个Map
,而是集合层次结构中的一两步,一个Iterable
:
val r1 = m.map{ case (k,v) => v}
Run Code Online (Sandbox Code Playgroud)
强制类型无法工作,因为a 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))
Run Code Online (Sandbox Code Playgroud)
在这里,Seq
比以下更通用化List
:
val r4 = m.toSeq
Run Code Online (Sandbox Code Playgroud)
@EndeNeu所说的简单解决方案就是使用toList
.如果map
是集合,它应该返回原始集合类型(如果可以).所以映射a Map
应该返回另一个Map
,除非底层结构使它不再是Map
(比如完全删除键)r1
.