出于某种奇怪的原因,有一个方法merged
只在scala.collection.immutable.HashMap
中声明,而不在泛型Map
trait中声明(也许它的实现使它对其他Map
实现非常不好?)
所以我需要把我的Map[A, B]
转换成HashMap[A, B]
,但到目前为止我还没有找到一个简单的方法。这是我目前对def to[Col[_]]
的 hack 实现,它需要一元高阶类而不是二进制高阶类。
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集合泛型特性的默认实现?
3条答案
按热度按时间ia2d9nvy1#
您可以从一个空的HashMap开始,并在其中添加所有元素:
whitzsjs2#
这不会回答您的问题,但它是您问题的解决方案。它会更快地执行以下操作:
1.实现map所需的
merged
方法,1.使用map上定义的
++
方法进行合并。ymzxtsji3#
假设原始Map已经是
immutable.HashMap
,最有效的转换方法是immutable.HashMap.from(originalMap)
,因为它返回的是已经是immutable.HashMap
的原始Map。但是考虑到
immutable.Map
构造函数仅在大小大于4时才生成immutable.HashMap
。