web-dev-qa-db-fra.com

Comment fonctionne la syntaxe mutable de mise à jour de carte [map (clé) = newValue] de Scala?

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?

18
Dan Midwood

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.

23
Boris the Spider

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))
}
}
0
AlexPes