23

我正在研究 Cay Horstmann 的 Scala 的《不耐烦》一书,在那里我遇到了这种更新可变地图的方式。

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")命中applyMapLike.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)但我不知道它是如何工作的,或者它是如何可能的。

它是如何工作的?

4

3 回答 3

27

这是apply,update语法的一个示例。

当您调用map("Something")this 调用map.apply("Something")时,它又调用get.

当您调用map("Something") = "SomethingElse"this 调用map.update("Something", "SomethingElse")时,它又调用put.

看看这个以获得更全面的解释。

于 2013-03-24T22:31:01.993 回答
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))
}
}
于 2018-08-29T11:36:28.950 回答
-1

问题是您正在尝试更新不可变地图。当我的地图被声明为

var m = new java.util.HashMap[String, Int]

但是当我将定义替换为

var m = new scala.collection.mutable.HashMap[String, Int]

工作的m.update

于 2013-11-06T20:14:57.470 回答