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

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

如何将其转换为不可变的?

不可变的层次结构不包含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: _* ) 
 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" ^ 

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

你可以只是以下

 val imm_map = MMMap.toMap