由于某种奇怪的原因,只有在scala.collection.immutable.HashMap
中声明了一个方法merged
,而在通用的Map
特质中却没有(也许它的实现使得其他Map
实现非常难以接受?)。
因此,我需要将我的Map[A, B]
转换为HashMap[A, B]
,但到目前为止,我找不到一个简单的方法来实现这一点。下面是我当前的实现方式,它可以绕过期望一元高级别而不是二元高级别的def to[Col[_]]
方法。
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集合通用特征的默认实现?
HashMap(m1.toSeq: _*)
?请参考 https://dev59.com/pmw05IYBdhLWcg3wuT8L 了解其他合并映射的选项。 - ŁukaszHashMap
中可用,为什么不一开始就将您的映射声明为HashMap
呢? - Rüdiger KlaehntoSeq
将需要 2 次迭代。同样,merged
被认为非常高效,所以最好使用它。 - Daniel ShintoMap
来获得这些映射。如果可能的话,我不想手动将其折叠成HashMap
。 - Daniel ShinHashMap.empty[String, Int] ++ array
。为了在一行内完成这个操作,你需要帮助类型推断器避免再次得到一个普通的Map
。可以使用((HashMap.empty ++ array): HashMap[String, Int]) merged ...
。 - ŁukaszHashMap
(就像您在这里使用to
一样)?创建一个中间的Map
有什么意义吗? - Régis Jean-Gilles