Veranderlijke naar onveranderlijke kaart converteren

Hoe converteer je het naar onveranderlijk?


Antwoord 1, autoriteit 100%

De onveranderlijke hiërarchie bevat geen MultiMap, dus u kunt de geconverteerde structuur niet gebruiken met dezelfde handige syntaxis. Maar als u graag met sleutel/waardeset-paren omgaat, dan:

Als u alleen een veranderlijke HashMapwilt, kunt u gewoon x.toMapgebruiken in 2.8 of collection.immutable.Map(x.toList: _*)in 2.7.

Maar als je wilt dat de hele structuur onveranderlijk is – inclusief de onderliggende set! – dan moet je meer doen: je moet de sets gaandeweg converteren. In 2.8:

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

In 2.7:

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

Antwoord 2, autoriteit 39%

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

Antwoord 3, autoriteit 15%

Je kunt myMap.toMapgebruiken om een ​​veranderlijke kaart om te zetten in onveranderlijk in Scala 2.8 en latere versies.

Kijken naar de definitie van toMapuit documentatie:

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
}

Antwoord 4, autoriteit 14%

Je kunt gewoon naar het volgende

val imm_map = MMMap.toMap

Other episodes