it-swarm.com.de

Wie kann ich immutable.Map in mutable.Map in Scala konvertieren?

Wie kann ich immutable.Map in mutable.Map in Scala konvertieren, damit ich die Werte in Map aktualisieren kann?

79
Łukasz Lew

Der sauberste Weg wäre die Verwendung der mutable.Map varargs Factory. Im Gegensatz zum ++-Ansatz wird hier der CanBuildFrom-Mechanismus verwendet, sodass das Potenzial möglicherweise effizienter ist, wenn Bibliothekscode geschrieben wurde, um dies zu nutzen:

val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*) 

Dies funktioniert, weil eine Map auch als eine Folge von Paaren angesehen werden kann.

110
Kevin Wright
val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap
36
Rex Kerr

Wie wäre es mit collection.breakOut?

import collection.{mutable, immutable, breakOut}
val myImmutableMap = immutable.Map(1->"one",2->"two")
val myMutableMap: mutable.Map[Int, String] = myImmutableMap.map(identity)(breakOut)
4
ymnk

Starten von Scala 2.13 über Factory Builder, die mit .to(factory) angewendet wurden:

Map(1 -> "a", 2 -> "b").to(collection.mutable.Map)
// collection.mutable.Map[Int,String] = HashMap(1 -> "a", 2 -> "b")
0
Xavier Guihot

Es gibt eine Variante zum Erstellen eines leeren veränderbaren Namens Map, dessen Standardwerte aus der unveränderlichen Variable Map übernommen werden. Sie können jederzeit einen Wert speichern und den Standardwert überschreiben:

scala> import collection.immutable.{Map => IMap}
//import collection.immutable.{Map=>IMap}

scala> import collection.mutable.HashMap
//import collection.mutable.HashMap

scala> val iMap = IMap(1 -> "one", 2 -> "two")
//iMap: scala.collection.immutable.Map[Int,Java.lang.String] = Map((1,one), (2,two))

scala> val mMap = new HashMap[Int,String] {      
     | override def default(key: Int): String = iMap(key)
     | }
//mMap: scala.collection.mutable.HashMap[Int,String] = Map()

scala> mMap(1)
//res0: String = one

scala> mMap(2)
//res1: String = two

scala> mMap(3)
//Java.util.NoSuchElementException: key not found: 3
//  at scala.collection.MapLike$class.default(MapLike.scala:223)
//  at scala.collection.immutable.Map$Map2.default(Map.scala:110)
//  at scala.collection.MapLike$class.apply(MapLike.scala:134)
//  at scala.collection.immutable.Map$Map2.apply(Map.scala:110)
//  at $anon$1.default(<console>:9)
//  at $anon$1.default(<console>:8)
//  at scala.collection.MapLike$class.apply(MapLike.scala:134)....

scala> mMap(2) = "three"

scala> mMap(2)          
//res4: String = three

Vorbehalt (siehe den Kommentar von Rex Kerr): Sie können keine Elemente aus der unveränderlichen Karte entfernen:

scala> mMap.remove(1)
//res5: Option[String] = None

scala> mMap(1)
//res6: String = one
0