private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
如何将它转换为不可变对象?
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
Set
可变;您无法更改结果Map
,但可以修改Set
。 - Abhijit Sarkar
MMMap.toMap
?"。 - Dmitry Bespalov