私はケイホルストマンの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
_
_MapLike.scala
_でscores("Alice")
がapply
にヒットするように見えます。ただし、これは値を返すだけで、更新可能なものは返しません。
好奇心から、不変のマップで同じ構文を試しましたが、次のエラーが表示されました、
_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)
に変換されると想定していますが、それがどのように機能するか、それがどのように可能かさえわかりません。
それはどのように機能しますか?
これは、apply
、update
構文の例です。
map("Something")
を呼び出すと、map.apply("Something")
が呼び出され、次にget
が呼び出されます。
map("Something") = "SomethingElse"
を呼び出すと、map.update("Something", "SomethingElse")
が呼び出され、次にput
が呼び出されます。
より完全な説明については this を見てください。
あなたはこれを試すことができます:=>マップのリストを更新する
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))
}
}