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]
Як перетворити його на незмінний?
MMMap.toMap
?
Відповіді:
Незмінна ієрархія не містить MultiMap, тому ви не зможете використовувати перетворену структуру з однаковим зручним синтаксисом. Але якщо ви із задоволенням маєте справу з парами ключ / значення, тоді:
Якщо ви просто хочете змінити HashMap
, ви можете просто використовувати x.toMap
версії 2.8 або collection.immutable.Map(x.toList: _*)
2.7.
Але якщо ви хочете, щоб вся структура була незмінною - включаючи базовий набір! - то вам доведеться зробити більше: вам потрібно перетворити набори по ходу. У 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
}
Ви можете просто до наступного
val imm_map = MMMap.toMap
Set
змінним; ви не можете мутувати результат Map
, але ви можете змінитиSet