Перетворення змінної на незмінну карту


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

Як перетворити його на незмінний?


Я думаю, ви створюєте новий? Просто гадаю, але зазвичай все працює так.
o0 '.

Я не впевнений, що ви маєте на увазі
Джеріхо

3
хм .. MMMap.toMap?
Дмитро Беспалов

Відповіді:


72

Незмінна ієрархія не містить 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: _*
)

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

Я трохи здивувався, коли побачив "mutableMap.toMap", але потім перевірив api і не знайшов нічого схожого. scala-lang.org/docu/files/api/scala/collection/mutable/… Друге видання - Набір [B] можна змінювати. Ось чому конвертувати не так просто.
Джеріхо

3
@Jeriho: toMap вводиться в Scala2.8
Eastsun

Thx Eastsun. Вибачте, Джеріхо, я не згадував про це.
michael.kebe

12

Ви можете використовувати 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
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.