Je travaille sur la Scala de Cay Horstmann pour le livre Impatient où j'ai découvert cette façon de mettre à jour une carte modifiable.
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
Il semble que scores("Alice")
apparaisse apply
dans MapLike.scala
. Mais cela ne renvoie que la valeur, pas quelque chose qui peut être mis à jour.
Par curiosité, j’ai essayé la même syntaxe sur une carte immuable et l’erreur suivante s’est présentée.
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
^
Sur cette base, je suppose que scores("Alice") = 5
est transformé en scores update ("Alice", 5)
mais je ne sais pas du tout comment cela fonctionne, ni même comment cela est possible.
Comment ça marche?
Ceci est un exemple de la syntaxe apply
, update
.
Lorsque vous appelez map("Something")
, ceci appelle map.apply("Something")
qui appelle get
.
Lorsque vous appelez map("Something") = "SomethingElse"
, ceci appelle map.update("Something", "SomethingElse")
qui appelle put
.
Jetez un oeil à this pour une explication plus complète.
Pouvez-vous essayer ceci: => pour mettre à jour la liste de la carte
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))
}
}