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

发布于 2024-09-01 09:41:41 字数 118 浏览 12 评论 0原文

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]

How convert it to immutable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

碍人泪离人颜 2024-09-08 09:41:41

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

The immutable hierarchy doesn't contain a MultiMap, so you won't be able to use the converted structure with the same convenient syntax. But if you're happy to deal with key/valueset pairs, then:

If you just want a mutable HashMap, you can just use x.toMap in 2.8 or collection.immutable.Map(x.toList: _*) in 2.7.

But if you want the whole structure to be immutable--including the underlying set!--then you have to do more: you need to convert the sets along the way. In 2.8:

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

In 2.7:

collection.immutable.Map(
  x.map(kv => (kv._1,collection.immutable.Set(kv._2.toList: _*))).toList: _*
)
戈亓 2024-09-08 09:41:41
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"
                ^
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"
                ^
最佳男配角 2024-09-08 09:41:41

您只需执行以下操作即可

val imm_map = MMMap.toMap

You can just to the following

val imm_map = MMMap.toMap
贵在坚持 2024-09-08 09:41:41

在 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
}

You can use myMap.toMap to convert an a mutable map into immutable in Scala 2.8 and later versions.

Looking at definition of toMap from documentation:

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
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文