我正在通过Cay Horstmann的Scala for the Impatient book,我遇到了这种更新可变地图的方式。
scala> val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
scores: scala.collection.mutable.Map[String,Int] = Map(Bob -> 3, Alice -> 10, Cindy -> 8)
scala> scores("Alice") // retrieve the value of type Int
res2: Int = 10
scala> scores("Alice") = 5 // Update the Alice value to 5
scala> scores("Alice")
res4: Int = 5
scores("Alice")
中的apply
点击MapLike.scala
。但这只会返回值,而不是可以更新的值。
出于好奇,我在不可变的地图上尝试了相同的语法,并出现以下错误,
scala> val immutableScores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
immutableScores: scala.collection.immutable.Map[String,Int] = Map(Alice -> 10, Bob -> 3, Cindy -> 8)
scala> immutableScores("Alice") = 5
<console>:9: error: value update is not a member of scala.collection.immutable.Map[String,Int]
immutableScores("Alice") = 5
^
基于此,我假设scores("Alice") = 5
已转换为scores update ("Alice", 5)
但我不知道它是如何工作的,或者它是如何工作的。
它是如何运作的?
答案 0 :(得分:23)
这是apply
,update
语法的示例。
当您拨打map("Something")
时,会拨打map.apply("Something")
,然后拨打get
。
当您拨打map("Something") = "SomethingElse"
时,会拨打map.update("Something", "SomethingElse")
,然后拨打put
。
请查看this以获得更全面的解释。
答案 1 :(得分:0)
您可以尝试以下方法吗:=>更新地图列表
import java.util.concurrent.ConcurrentHashMap
import scala.collection.JavaConverters._
import scala.collection.concurrent
val map: concurrent.Map[String, List[String]] = new ConcurrentHashMap[String, List[String]].asScala
def updateMap(key: String, map: concurrent.Map[String, List[String]], value: String): Unit = {
map.get(key) match {
case Some(list: List[String]) => {
val new_list = value :: list
map.put(key, new_list)
}
case None => map += (key -> List(value))
}
}
答案 2 :(得分:-1)
问题是你正在尝试更新不可变的地图。当我的地图被声明为
时,我收到了同样的错误消息var m = new java.util.HashMap[String, Int]
但是当我用
替换定义时var m = new scala.collection.mutable.HashMap[String, Int]
m.update
工作。