scala immutability mutable scala-collections

scala - Convertir mapa mutable a mapa inmutable



immutability scala-collections (4)

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

¿Cómo convertirlo a inmutable?


La jerarquía inmutable no contiene un MultiMap, por lo que no podrá usar la estructura convertida con la misma sintaxis conveniente. Pero si está contento de tratar con pares clave / valor, entonces:

Si solo quiere un HashMap mutable, puede usar x.toMap en 2.8 o collection.immutable.Map(x.toList: _*) en 2.7.

Pero si desea que toda la estructura sea inmutable, incluido el conjunto subyacente, debe hacer más: debe convertir los conjuntos en el camino. En 2.8:

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

En 2.7:

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


Puede usar myMap.toMap para convertir un mapa mutable en inmutable en Scala 2.8 y versiones posteriores.

Mirando la definición de toMap de la documentación:

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 }


Puedes simplemente a lo siguiente

val imm_map = MMMap.toMap


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" ^