scala map scala-2.8

¿Cómo puedo convertir inmutable.Map en mutable.Map en Scala?



scala-2.8 (4)

¿Cómo puedo convertir inmutable.Map en mutable.Map en Scala para poder actualizar los valores en Map?


¿Qué hay de usar 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)


Existe una variante para crear un Map mutable vacío que tiene valores predeterminados tomados del Map inmutable. Puede almacenar un valor y anular el valor predeterminado en cualquier momento:

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

Advertencia (ver el comentario de Rex Kerr): No podrás eliminar los elementos provenientes del mapa inmutable:

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


La forma más limpia sería usar la fábrica mutable.Map varargs. A diferencia del enfoque ++ , este usa el mecanismo CanBuildFrom , y tiene el potencial de ser más eficiente si el código de la biblioteca fue escrito para aprovechar esto:

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

Esto funciona porque un Map también se puede ver como una secuencia de Pares.


val myImmutableMap = collection.immutable.Map(1->"one",2->"two") val myMutableMap = collection.mutable.Map() ++ myImmutableMap