【问题标题】:Converting mutable to immutable map将可变映射转换为不可变映射
【发布时间】:2010-05-12 08:22:35
【问题描述】:
private[this]object MMMap extends  HashMap[A, Set[B]] with MultiMap[A, B]

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

【问题讨论】:

  • 你创建了一个新的?只是猜测,但通常事情是这样的。
  • 我不知道你是什么意思
  • 嗯.. MMMap.toMap ?

标签: scala immutability mutable scala-collections


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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] 是可变的。这就是为什么转换不是那么容易的原因。
    • @Jeriho:在Scala2.8中引入了toMap
    • 感谢 Eastsun。对不起杰里霍,我没有提到它。
    【解决方案3】:

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

    查看文档中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
    }
    

    【讨论】:

      【解决方案4】:

      你可以只到以下

      val imm_map = MMMap.toMap
      

      【讨论】:

      • 这使得Set 可变;你不能改变生成的Map,但你可以修改Set
      猜你喜欢
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多