Scala 如何将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

我有一个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.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