web-dev-qa-db-fra.com

Conversion d'une carte mutable en carte immuable

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

Comment le convertir en immuable?

69
Jeriho

La hiérarchie immuable ne contient pas de MultiMap, vous ne pourrez donc pas utiliser la structure convertie avec la même syntaxe pratique. Mais si vous êtes heureux de traiter avec des paires clé/jeu de valeurs, alors:

Si vous voulez juste un HashMap modifiable, vous pouvez simplement utiliser x.toMap En 2.8 ou collection.immutable.Map(x.toList: _*) en 2.7.

Mais si vous voulez que toute la structure soit immuable - y compris l'ensemble sous-jacent! - alors vous devez faire plus: vous devez convertir les ensembles en cours de route. 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: _*
)
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

Vous pouvez utiliser myMap.toMap pour convertir une carte mutable en immuable dans Scala 2.8 et versions ultérieures.

En regardant la définition de toMap à partir de la documentation:

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

Vous pouvez simplement accéder aux éléments suivants

val imm_map = MMMap.toMap
6