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


Answers:


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 / ...第二个问题-Set [B]是可变的。这就是为什么转换不是那么容易的原因。
耶利霍2010年

3
@Jeriho:toMap是在Scala2.8中引入的-Eastsun
2010年

Thx Eastsun。抱歉,Jeriho,我没有提到。
michael.kebe,2010年

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
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.