private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Comment le convertir en immuable?Conversion de mutable en carte immuable
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Comment le convertir en immuable?Conversion de mutable en carte immuable
La hiérarchie immuable ne contient pas de Multimap, donc vous ne serez pas en mesure d'utiliser la structure convertie avec la même syntaxe pratique. Mais si vous êtes heureux de traiter avec des paires clé/ValueSet, puis:
Si vous voulez juste un mutable HashMap
, vous pouvez simplement utiliser x.toMap
2.8 ou collection.immutable.Map(x.toList: _*)
2.7.
Mais si vous voulez que la structure entière soit immuable - y compris l'ensemble sous-jacent! - alors vous devez en faire plus: vous devez convertir les ensembles en cours de route. 2.8:
x.map(kv => (kv._1,kv._2.toSet)).toMap
2.7:
collection.immutable.Map(
x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)
Avec impatience d'attente pour scala 2.8-stable – Jeriho
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"
^
J'ai été surpris un peu quand j'ai vu "mutableMap.toMap" mais ensuite j'ai vérifié api et je n'ai rien trouvé qui ressemble à. http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html Deuxième édition - L'ensemble [B] est modifiable. C'est pourquoi la conversion n'est pas si facile. – Jeriho
@Jeriho: toMap est introduit dans Scala2.8 – Eastsun
Thx Eastsun. Désolé Jeriho, je ne l'ai pas mentionné. –
Vous pouvez utiliser myMap.toMap
pour convertir un plan en mutable immuable dans Scala 2.8 et les versions ultérieures.
Regarder définition toMap
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
}
Vous pouvez juste les éléments suivants
val imm_map = MMMap.toMap
I * * suppose que vous créez un nouveau? Juste deviner, mais généralement les choses fonctionnent de cette façon. –
Je ne suis pas sûr de savoir ce que vous voulez dire – Jeriho
hmm .. 'MMMap.toMap'? –