将可变映射转换为不可变映射

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

如何将它转换为不可变对象?


你会创建一个新的?只是猜测,但通常事情都是这样运作的。 - o0'.
我不确定你的意思是什么。 - Jeriho
4
这句话翻译过来的意思是:"嗯。。MMMap.toMap?"。 - Dmitry Bespalov
4个回答

77

不可变层次结构中没有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: _*
)

34
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,并没有找到类似的内容。 http://www.scala-lang.org/docu/files/api/scala/collection/mutable/HashMap.html 第二个问题 - Set [B] 是可变的。这就是为什么转换不是那么容易的原因。 - Jeriho
4
toMap是在Scala2.8中引入的。 - Eastsun
谢谢Eastsun。抱歉Jeriho,我没有提到它。 - michael.kebe

13
你可以使用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
}

12

你可以只需按照以下步骤

val imm_map = MMMap.toMap

这将使Set可变;您无法更改结果Map,但可以修改Set - Abhijit Sarkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接