web-dev-qa-db-ja.com

可変マップから不変マップへの変換

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

どのように不変に変換しますか?

69
Jeriho

不変の階層にはMultiMapが含まれていないため、変換された構造を同じ便利な構文で使用することはできません。ただし、キー/値セットのペアを処理することに満足している場合は、次のようにします。

単に可変のHashMapが必要な場合は、2.8では_x.toMap_を、2.7ではcollection.immutable.Map(x.toList: _*)を使用できます。

しかし、基礎となるセットを含む構造全体を不変にしたい場合は、さらに多くのことを行う必要があります。セットを途中で変換する必要があります。 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: _*
)
_
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

myMap.toMapを使用して、Scala 2.8以降のバージョンで変更可能なマップを不変に変換できます。

ドキュメントからtoMapの定義を見る:

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

次のことができます

val imm_map = MMMap.toMap
6