scala - 无需复制即可使可变映射不可变的方法

标签 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]

最佳答案

您可以简单地返回 collection.Map,它是 collection.mutable.Mapcollection.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/

相关文章:

scala - 多项目设置 - 未检测到主类

rust - Rust 中的不可变变量和常量变量有什么区别?

scala - 比较两个 Scala 列表以检查其中一个/包含

scala - 如何将此 SetLike 集合从 Scala 2.12 转换为 2.13?

Scala 过滤序列以与尊重和不尊重过滤条件的元素进行映射

list - Groovy 列表和 map

scala - 线程安全地变换可变映射中的值

java - Map.Entry<K,V> 的比较器

F# 模式匹配直接针对 let 绑定(bind)

Python - 如何创建在 __init__ 期间可配置的不可变类成员