使可变的映射变为不可变的,而无需复制。

3
我想在闭合范围内将可变映射转换为不可变映射。以下是示例代码和无意义的防御性拷贝:
def func(): immutable.Map[String, Int] = {
    val map = mutable.HashMap[String, Int]
    // here goes operations for the map
    return immutable.HashMap ++ map
}

我曾经写过“无意义”的代码,这里进行防御性拷贝是完全浪费时间的,因为可变映射实际上在外部是不可变的。如果我们只能让外部看到 getter 操作,那么性能应该会更好。

问题在于我真的不知道如何做到。我尝试简单地用匿名不可变映射实例包装它,但 def +[B1 >: B](kv: (A, B1)) 方法使其不可能。

请帮帮我!

编辑:只是忘记将返回类型[Int, Int] 更正为 [String, Int]

1个回答

6
你可以直接返回 collection.Map,它是collection.mutable.Mapcollection.immutable.Map的共同超类型。
def func(): collection.Map[Int, Int] = {
  val map = mutable.HashMap[String, Int]
  // here goes operations for the map
  return map
}

用户可以将其转换为mutable.Map,但是在任何避免复制的解决方案中,他们也可以通过反射获取可变地图,或者即使进行复制,也可以改变不可变地图。

我希望返回的地图是不可变的地图,但是collection.Map看起来也是不可变的。我很困惑...如果您不介意,能告诉我immutable.Map通过继承collection.Map实现了什么吗? :/ - Ryoichiro Oka
@AlexeyRomanov 太棒了!简短明了。有时集合库似乎很复杂,包含太多特性,但看到这个就明白了。 - wheaties
1
@RyoichiroOka 它们基本上具有相同的API。immutable.Map实际上是不可变的(除非使用反射,如上所述); collection.Map可以是可变或不可变的(但即使它是可变的,您也无法访问变异方法,除非将其强制转换)。 - Alexey Romanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接