val mymap= collection.mutable.Map.empty[String,Seq[String]]
mymap("key") = collection.mutable.ListBuffer("a","b")
mymap.get("key") += "c"
要追加到列表缓冲区的最后一行是错误的。如何进行追加?
答案 0 :(得分:2)
在scala控制台中运行代码时:
→$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))
您会看到mymap.get("key")
是可选类型。您无法将字符串添加到可选类型。
此外,由于您向mymap
键入了Seq[String]
,因此Seq[String]
没有+=
运算符接收字符串。
以下作品:
val mymap= collection.mutable.Map.empty[String,collection.mutable.ListBuffer[String]]
mymap("key") = collection.mutable.ListBuffer("a","b")
mymap.get("key").map(_ += "c")
使用.map
函数将利用可选类型,并像Łukasz所说的那样阻止noSuchElementException。
答案 1 :(得分:0)
一次处理一个问题:
Map.get
返回Option[T]
而Option
未提供+=
或+
方法。Map.apply
(mymap("key")
),apply
的返回类型也会是V
(在这种情况下为Seq
),无论实际是什么具体类型是(Vector
,List
,Set
等。 Seq
未提供+=
方法,其+
方法需要另一个Seq
。鉴于此,要获得您想要的内容,您需要将Map
的类型声明为可变类型:
import collection.mutable.ListBuffer
val mymap= collection.mutable.Map.empty[String,ListBuffer[String]]
mymap("key") = ListBuffer("a","b")
mymap("key") += "c"
将按预期工作。
答案 2 :(得分:0)
如果你真的想拥有不可变的价值,那么这样的事情也应该有效:
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"
我在这里使用了Vector,因为在List的末尾添加元素在设计上是无效的。