Преобразование изменяемой в неизменяемую карту - PullRequest
66 голосов
/ 12 мая 2010
private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]

Как преобразовать его в неизменяемый?

Ответы [ 4 ]

62 голосов
/ 12 мая 2010

Неизменяемая иерархия не содержит 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: _*
)
27 голосов
/ 12 мая 2010
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"
                ^
11 голосов
/ 26 июля 2016

Вы можете использовать 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
}
5 голосов
/ 07 мая 2017

Вы можете просто к следующему

val imm_map = MMMap.toMap
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...