我想在封闭范围内将可变映射转换为不可变映射。这是情况和无意义的防御副本的示例代码:
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]
最佳答案
您可以简单地返回 collection.Map
,它是 collection.mutable.Map
和 collection.immutable.Map
的通用父类(super class)型:
def func(): collection.Map[Int, Int] = {
val map = mutable.HashMap[String, Int]
// here goes operations for the map
return map
}
用户可以将其转换为 mutable.Map
,但他们也可以在任何避免复制的解决方案中通过反射获得可变映射,或者即使在复制时也可以改变不可变映射。
关于scala - 无需复制即可使可变映射不可变的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613891/