Konvertieren von veränderlichen in unveränderliche Karten


Antworten:


70

Die unveränderliche Hierarchie enthält keine MultiMap, sodass Sie die konvertierte Struktur nicht mit derselben praktischen Syntax verwenden können. Wenn Sie sich jedoch gerne mit Schlüssel / Wertesatz-Paaren befassen, dann:

Wenn Sie nur eine veränderbare Version möchten HashMap, können Sie diese x.toMapin 2.8 oder collection.immutable.Map(x.toList: _*)2.7 verwenden.

Wenn Sie jedoch möchten, dass die gesamte Struktur unveränderlich ist - einschließlich der zugrunde liegenden Menge! -, müssen Sie mehr tun: Sie müssen die Mengen auf dem Weg konvertieren. In 2.8:

x.map(kv => (kv._1,kv._2.toSet)).toMap

In 2.7:

collection.immutable.Map(
  x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)

29
scala> val mutableMap = new HashMap[Int, String]
mutableMap: scala.collection.mutable.HashMap[Int,String] = Map()

scala> mutableMap += 1 -> "a"
res5: mutableMap.type = Map((1,a))

scala> mutableMap
res6: scala.collection.mutable.HashMap[Int,String] = Map((1,a))

scala> val immutableMap = mutableMap.toMap
immutableMap: scala.collection.immutable.Map[Int,String] = Map((1,a))

scala> immutableMap += 2 -> "b"
<console>:11: error: reassignment to val
       immutableMap += 2 -> "b"
                ^

Ich war ein bisschen überrascht, als ich "mutableMap.toMap" sah, aber dann überprüfte ich die API und fand nichts Ähnliches. scala-lang.org/docu/files/api/scala/collection/mutable/… Zweite Ausgabe - Set [B] ist veränderlich. Deshalb ist das Konvertieren nicht so einfach.
— Jeriho

3
@ Jeriho: toMap wird in Scala2.8
— Eastsun

Thx Eastsun. Entschuldigung Jeriho, ich habe es nicht erwähnt.
— michael.kebe

12

Sie können myMap.toMapeine veränderbare Karte in Scala 2.8 und späteren Versionen in unveränderliche konvertieren.

Betrachtet man die Definition von toMapaus der Dokumentation:

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = {
  val b = immutable.Map.newBuilder[T, U]
  for (x <- self) b += x
  b.result
}

8

Sie können nur zu folgendem

val imm_map = MMMap.toMap

Dies lässt das SetVeränderliche; Sie können das Ergebnis nicht mutieren Map, aber Sie können dasSet
— Abhijit Sarkar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.