private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
どのようにそれを不変に変換しますか?
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
どのようにそれを不変に変換しますか?
不変の階層にはMultiMapが含まれていないため、変換された構造を同じ便利な構文で使用することはできません。ただし、キーと値セットのペアを処理することに満足している場合は、次のようにします。
ミュータブルが必要な場合は、2.8または2.7でHashMap
使用できます。x.toMap
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: _*
)
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"
^
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
}