wake-up-neo.com

Umwandlung von wandelbarer in unveränderliche Karte

private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]

Wie konvertiere ich es in unveränderlich?

69
Jeriho

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

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

Aber wenn Sie möchten, dass die gesamte Struktur - einschließlich der zugrunde liegenden Menge! - unveränderlich ist, 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: _*
)
64
Rex Kerr
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"
                ^
27
michael.kebe

Sie können myMap.toMap, um eine veränderbare Karte in unveränderlich in Scala 2.8 und neuere Versionen umzuwandeln.

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
}
11
Fahad Siddiqui

Sie können nur zu den folgenden

val imm_map = MMMap.toMap
6