如何将可变HashMap转换为Scala中的不可变等效项?

Iva*_*van 13 scala mutable immutability scala-collections

在我的函数内部,我通过用数据填充新的可变HashMap来构造结果集(如果有更好的方法 - 我很感激评论).然后我想将结果集作为不可变的HashMap返回.如何从变量中导出一个不可变的?

ebr*_*hez 13

关于返回immutable.Map与否的讨论immutable.HashMap,如何简单地使用该toMap方法:

scala> val m = collection.mutable.HashMap(1 -> 2, 3 -> 4)
m: scala.collection.mutable.HashMap[Int,Int] = Map(3 -> 4, 1 -> 2)

scala> m.toMap
res22: scala.collection.immutable.Map[Int,Int] = Map(3 -> 4, 1 -> 2)
Run Code Online (Sandbox Code Playgroud)

作为2.9,这里采用的方法toMapTraversableOnce,这是如下实现的:

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
}
Run Code Online (Sandbox Code Playgroud)


dhg*_*dhg 8

scala> val m = collection.mutable.HashMap(1->2,3->4)
m: scala.collection.mutable.HashMap[Int,Int] = Map(3 -> 4, 1 -> 2)

scala> collection.immutable.HashMap() ++ m
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)
Run Code Online (Sandbox Code Playgroud)

要么

scala> collection.immutable.HashMap(m.toSeq:_*)
res2: scala.collection.immutable.HashMap[Int,Int] = Map(1 -> 2, 3 -> 4)
Run Code Online (Sandbox Code Playgroud)

  • 是的,最好尽量使用通用类型,但要提供尽可能具体的类型,不是吗? (3认同)