private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Wie konvertiere ich es in unveränderlich?
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Wie konvertiere ich es in unveränderlich?
MMMap.toMap
?
Antworten:
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.toMap
in 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: _*
)
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"
^
Sie können myMap.toMap
eine veränderbare Karte in Scala 2.8 und späteren Versionen in unveränderliche konvertieren.
Betrachtet man die Definition von toMap
aus 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
}
Sie können nur zu folgendem
val imm_map = MMMap.toMap
Set
Veränderliche; Sie können das Ergebnis nicht mutieren Map
, aber Sie können dasSet