将mutable转换为不可变映射

Jer*_*iho 71 scala mutable immutability scala-collections

private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]
Run Code Online (Sandbox Code Playgroud)

如何将其转换为不可变?

Rex*_*err 66

不可变层次结构不包含MultiMap,因此您将无法使用具有相同方便语法的转换结构.但如果您愿意处理键/值集对,那么:

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

但是如果你想要整个结构是不可变的 - 包括基础集! - 那么你必须做更多:你需要在整个过程中转换集.在2.8中:

x.map(kv => (kv._1,kv._2.toSet)).toMap
Run Code Online (Sandbox Code Playgroud)

在2.7中:

collection.immutable.Map(
  x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)
Run Code Online (Sandbox Code Playgroud)


mic*_*ebe 28

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"
                ^
Run Code Online (Sandbox Code Playgroud)

  • @Jeriho:toMap是在Scala2.8中引入的 (3认同)

Fah*_*qui 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
}
Run Code Online (Sandbox Code Playgroud)


Har*_*thy 6

你可以只对以下内容

val imm_map = MMMap.toMap
Run Code Online (Sandbox Code Playgroud)