Scala 如何将Map[String,Seq[String]]转换为Map[String,String]
我有一个Map[String,Seq[String]],我想基本上把它转换成Map[String,String],因为我知道序列只有一个值。我想我是通过以下操作得到的:Scala 如何将Map[String,Seq[String]]转换为Map[String,String],scala,Scala,我有一个Map[String,Seq[String]],我想基本上把它转换成Map[String,String],因为我知道序列只有一个值。我想我是通过以下操作得到的: mymap.flatMap(x => Map(x._1 -> x._2.head)) 您可以使用mapValues() 其他人已经提到了mapValues,但如果我是你,我会这样做: scala> val m = Map(1 -> Seq(1), 2 -> Seq(2)) m: scala.col
mymap.flatMap(x => Map(x._1 -> x._2.head))
您可以使用
mapValues()
其他人已经提到了
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时引发异常。使用\u0
或\u0.head
将在元素为零时引发异常,但如果元素多于一个,则不会抱怨,这可能会导致以后在没有错误的情况下丢失东西时出现神秘的错误还有一项建议:
m mapValues { _.mkString }
这一个与Seq是否有多个元素无关——它只是将所有字符串连接在一起。如果您关心每个值的重新计算,可以提前进行:
(m mapValues { _.mkString }).view.force
该操作称为“map”(不要与map ADT混淆)。尝试了什么?看起来有人在一月份问了一个非常类似的问题:这是一个开始。考虑把它放在帖子本身。但是,使用普通的
映射
(或其他专用函数)可以更简单、更高效地完成。编写头
而不是(0)
(m mapValues { _.mkString }).view.force