如何将listbuffer附加到Scala中可变映射的值?

如何将listbuffer附加到Scala中可变映射的值?,scala,Scala,要附加到列表缓冲区的最后一行是给定错误。如何进行追加?在scala控制台中运行代码时: val mymap= collection.mutable.Map.empty[String,Seq[String]] mymap("key") = collection.mutable.ListBuffer("a","b") mymap.get("key") += "c" 您将看到mymap.get(“key”)是一种可选类型。无法将字符串添加到可选类型 此外,由于您键入了mymap到Seq[String

要附加到列表缓冲区的最后一行是给定错误。如何进行追加?

在scala控制台中运行代码时:

val mymap= collection.mutable.Map.empty[String,Seq[String]]
mymap("key") = collection.mutable.ListBuffer("a","b")
mymap.get("key") += "c"
您将看到
mymap.get(“key”)
是一种可选类型。无法将字符串添加到可选类型

此外,由于您键入了
mymap
Seq[String]
Seq[String]
没有接受字符串的
+=
运算符

以下工作:

→$scala
scala> val mymap= collection.mutable.Map.empty[String,Seq[String]]
mymap: scala.collection.mutable.Map[String,Seq[String]] = Map()

scala> mymap("key") = collection.mutable.ListBuffer("a","b")

scala> mymap.get("key")
res1: Option[Seq[String]] = Some(ListBuffer(a, b))

使用
.map
功能将利用可选类型并防止出现如Łukasz所述的NoTouchElementException。

一次处理一个问题:

  • Map.get
    返回一个
    选项[T]
    选项
    不提供
    +=
    +
    方法
  • 即使使用
    Map.apply
    mymap(“key”)
    ),无论实际的具体类型是什么(
    Vector
    List
    Set
    ),
    apply
    的返回类型都将是
    V
    (在本例中为
    Seq
    Seq
    不提供
    +=
    方法,其
    +
    方法需要另一个
    Seq
  • 因此,要获得所需的内容,需要将
    映射的类型声明为可变类型:

    val mymap= collection.mutable.Map.empty[String,collection.mutable.ListBuffer[String]]
    mymap("key") = collection.mutable.ListBuffer("a","b")
    mymap.get("key").map(_ += "c")
    

    将按您预期的方式工作。

    如果您确实希望具有不可变的值,那么类似的内容也应该可以工作:

    import collection.mutable.ListBuffer
    val mymap= collection.mutable.Map.empty[String,ListBuffer[String]]
    mymap("key") = ListBuffer("a","b")
    mymap("key") += "c"
    
    我在这里使用Vector,因为在列表末尾添加元素在设计上是无效的。

    mymap.get(“key”).map(+=“c”)
    可以避免
    NoTouchElementException
    val mymap= collection.mutable.Map.empty[String,Seq[String]]
    mymap("key") = Vector("a","b")
    val oldValue = mymap.get("key").getOrElse(Vector[String]())
    mymap("key") = oldValue :+ "c"