如何从scala映射转换为scala.collection.immutable.HashMap?

如何从scala映射转换为scala.collection.immutable.HashMap?,scala,scala-collections,Scala,Scala Collections,出于某种奇怪的原因,有一种方法merged,它只在scala.collection.immutable.HashMap中声明,而不是在genericMaptrait中声明(也许它的实现使得它对其他Map实现非常不受欢迎?) 因此,我需要将我的Map[A,B]转换为HashMap[A,B],到目前为止,我还没有找到一种简单的方法来实现。这是我目前对[Col[\u]]的定义进行破解的实现,它需要一元更高的种类,而不是二进制更高的种类 val m1 = Map("foo" -> 1) val m

出于某种奇怪的原因,有一种方法
merged
,它只在
scala.collection.immutable.HashMap
中声明,而不是在generic
Map
trait中声明(也许它的实现使得它对其他
Map
实现非常不受欢迎?)

因此,我需要将我的
Map[A,B]
转换为
HashMap[A,B]
,到目前为止,我还没有找到一种简单的方法来实现。这是我目前对[Col[\u]]的定义进行破解的实现,它需要一元更高的种类,而不是二进制更高的种类

val m1 = Map("foo" -> 1)
val m2 = Map("foo" -> 2, "bar" -> 2)

type HM[_] = HashMap[String, Int]
(m1.to[HM] merged m2.to[HM]) { case ((k1, v1), (k2, v2)) => (k1, v1 + v2) } // Map("foo" -> 3, "bar" -> 2)
它的工作原理与预期一样,但我不禁想到,必须有更好的方法将
Map
转换为
HashMap
(假设它是默认实现)


或者更一般地说,访问scala collection generic traits的默认实现的更好方法?

您可以从一个空HashMap开始,并在其中添加所有元素:

immutable.HashMap.empty ++= yourMap

这不会回答您的问题,但它是您问题的解决方案。 它将更快地实现以下目标:

  • 实现map所需的
    merged
    方法
  • 使用map上定义的
    ++
    方法进行合并

  • 也许
    哈希映射(m1.toSeq:*)
    ?有关合并映射的其他选项,请参阅。如果您使用的操作仅在
    HashMap
    中可用,为什么不首先将您的映射声明为
    HashMap
    ?@ukasz是的,我看到了这个问题,但我的代码的这一部分对性能非常敏感,使用
    toSeq
    将需要两次迭代。同样地,
    merged
    被认为是非常有效的,所以最好使用它。@RüdigerKlaehn因为我通过调用数组上的
    toMap
    来获得这些映射。我可以手动将其折叠为
    HashMap
    ,但如果可能的话,不可以。因此,如果您想加快速度,可能需要使用数组并执行
    HashMap。空[String,Int]++array
    。要内联执行此操作,您需要帮助类型推断不再获得普通的
    映射<代码>((HashMap.empty++array):HashMap[String,Int])合并…
    OP-want
    不可变。HashMap
    @ukasz:修复,也没有太大区别,应该只是
    ++
    ,而不是
    ++=