it-swarm.com.de

Wie funktioniert die Syntax für Scalas veränderbare Kartenaktualisierung [map (key) = newValue]?

Ich arbeite gerade an Cay Horstmanns Scala für das Ungeduldige Buch, in dem ich auf diese Weise eine veränderbare Karte aktualisiert habe.

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

Es sieht aus wie scores("Alice") Treffer apply in MapLike.scala. Dies gibt jedoch nur den Wert zurück, nicht etwas, das aktualisiert werden kann.

Aus Neugier versuchte ich die gleiche Syntax auf einer unveränderlichen Karte und wurde mit dem folgenden Fehler dargestellt,

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
          ^

Basierend darauf gehe ich davon aus, dass scores("Alice") = 5 in scores update ("Alice", 5) umgewandelt wird, aber ich habe keine Ahnung, wie es funktioniert oder wie es überhaupt möglich ist.

Wie funktioniert es?

18
Dan Midwood

Dies ist ein Beispiel für die Syntax apply, update.

Wenn Sie map("Something") aufrufen, ruft dies map.apply("Something") auf, die wiederum get aufruft.

Wenn Sie map("Something") = "SomethingElse" aufrufen, ruft dies map.update("Something", "SomethingElse") auf, die wiederum put aufruft.

Werfen Sie einen Blick auf this , um eine ausführlichere Erklärung zu erhalten.

23

Kannst du folgendes versuchen: => um die Map-Liste zu aktualisieren

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