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

Scala 将可变映射转换为不可变映射,scala,immutability,mutable,scala-collections,Scala,Immutability,Mutable,Scala Collections,如何将其转换为不可变?scala>val mutableMap=new HashMap[Int,String] private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B] mutableMap:scala.collection.mutable.HashMap[Int,String]=Map() scala>mutableMap+=1->“a” res5:mutableMap.type=Map((1,a))

如何将其转换为不可变?

scala>val mutableMap=new HashMap[Int,String]
private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]
mutableMap:scala.collection.mutable.HashMap[Int,String]=Map() scala>mutableMap+=1->“a” res5:mutableMap.type=Map((1,a)) scala>可变映射 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” :11:错误:重新分配到val immutableMap+=2->“b” ^
不可变层次结构不包含多重映射,因此您将无法使用相同方便语法的转换结构。但如果您乐于处理键/值集对,那么:

如果您只需要一个可变的
HashMap
,您可以在2.8中使用
x.toMap
,或者在2.7中使用
collection.immutable.Map(x.toList:*)

但是如果您希望整个结构是不可变的——包括底层集合--然后,您必须做更多的工作:您需要在此过程中转换集合。在2.8中:

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"
                ^
在2.7中:

x.map(kv => (kv._1,kv._2.toSet)).toMap

在Scala 2.8及更高版本中,您可以使用
myMap.toMap
将可变映射转换为不可变映射

查看文档中的
toMap
定义:

collection.immutable.Map(
  x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)

def-toMap[T,U](隐式ev:A您只需执行以下操作

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
}

我猜你创建了一个新的?只是猜测,但通常情况下都是这样。我不确定你的意思是什么嗯..
MMMap.toMap
?当我看到“mutableMap.toMap”时,我有点惊讶,但后来我验证了api,没有发现任何类似的。第二个问题-集[B]是可变的。这就是为什么转换不那么容易的原因。@Jeriho:toMap是在Scala2.8Thx Eastsun中引入的。很抱歉Jeriho,我没有提到它。这使得
是可变的;您不能变异生成的
映射
,但您可以修改
val imm_map = MMMap.toMap