在不复制的情况下使可变映射不可变的方法

时间:2014-05-12 16:11:34

标签: scala map immutability mutable

我想将一个可变映射转换为封闭范围内的不可变映射。以下是情况和无意义防御副本的示例代码:

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 个答案:

答案 0 :(得分: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,但他们也可以通过任何解决方案中的反射来获取可变映射,避免复制,或者即使在复制时也会改变不可变映射。