如何将listbuffer附加到Scala中可变映射的值?
要附加到列表缓冲区的最后一行是给定错误。如何进行追加?在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
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"