【发布时间】:2016-08-27 03:22:56
【问题描述】:
出于某种奇怪的原因,有一个方法 merged 仅在 scala.collection.immutable.HashMap 中声明,但不在通用 Map 特征中声明(也许它的实现使其对其他 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 集合通用特征的默认实现的更好方法?
【问题讨论】:
-
可能是
HashMap(m1.toSeq: _*)?有关合并地图的其他选项,请参阅 stackoverflow.com/questions/7076128/…。 -
如果您使用仅在
HashMap中可用的操作,为什么不首先将您的地图声明为HashMap? -
@Łukasz 是的,我已经看到了这个问题,但是我的这部分代码对性能非常敏感,使用
toSeq将需要 2 次迭代。同样,merged据说效率很高,所以使用它会很好。 -
@RüdigerKlaehn 因为我通过在数组上调用
toMap来获取这些地图。我可以手动将其折叠到HashMap,但如果可能的话不要折叠。 -
因此,如果您想更快,您可能想要使用您的阵列并执行
HashMap.empty[String, Int] ++ array。要内联执行此操作,您需要帮助进行类型推断,以免再次获得普通的Map。((HashMap.empty ++ array): HashMap[String, Int]) merged ...