我有一个映射[ String,SeqString],我想把它基本上转换成一个MapString,String,因为我知道这个序列只有一个值。
发布于 2012-09-19 01:53:24
其他人已经提到了mapValues
,但如果我是你,我会这样做:
scala> val m = Map(1 -> Seq(1), 2 -> Seq(2))
m: scala.collection.immutable.Map[Int,Seq[Int]] = Map(1 -> List(1), 2 -> List(2))
scala> m.map { case (k,Seq(v)) => (k,v) }
res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2)
有两个原因:
mapValues
方法生成结果映射的视图,这意味着每次访问元素时都会重新计算函数。除非您计划只访问每个元素一次,或者只计划访问其中的一小部分,否则您不希望发生这种重新计算。(k,Seq(v))
一起使用可以确保,如果函数发现某个Seq不包含恰好一个元素,就会抛出异常。如果有零个元素,使用_(0)
或_.head
将抛出异常,但如果您有多个元素,则不会抱怨,这可能会在以后没有错误地丢失内容时导致神秘的错误。发布于 2012-09-19 01:36:52
您可以使用mapValues()
。
scala> Map("a" -> Seq("aaa"), "b" -> Seq("bbb"))
res0: scala.collection.immutable.Map[java.lang.String,Seq[java.lang.String]] = M
ap(a -> List(aaa), b -> List(bbb))
scala> res0.mapValues(_(0))
res1: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(a
-> aaa, b -> bbb)
发布于 2012-09-19 01:36:11
我想我是通过执行以下操作获得的:
mymap.flatMap(x => Map(x._1 -> x._2.head))
https://stackoverflow.com/questions/12482036
复制相似问题