我目前的用例非常简单,可变或不可变 Map 都可以解决问题。
有一个采用不可变 Map 的方法,然后调用一个也采用不可变 Map 的第 3 方 API 方法
def doFoo(foo: String = "default", params: Map[String, Any] = Map()) {
val newMap =
if(someCondition) params + ("foo" -> foo) else params
api.doSomething(newMap)
}
有问题的地图通常很小,最多可能有一个嵌入的案例类实例列表,最多几千个条目。因此,再次假设在这种情况下不可变影响不大(即通过 newMap val 副本基本上拥有 2 个 Map 实例)。
尽管如此,它还是让我有点烦,复制地图只是为了得到一张新地图,上面贴了一些 k->v 条目。
对于我想要附加的条目,我可以使用 mutable 和params.put("bar", bar)
等,然后params.toMap
为 api 调用转换为不可变的,这是一个选项。但是我必须导入和传递可变映射,与使用 Scala 的默认不可变映射相比,这有点麻烦。
那么,什么时候使用可变地图而不是不可变地图是合理/良好的做法的一般准则是什么?
谢谢
编辑 所以,在不可变地图上的添加操作似乎花费了几乎恒定的时间,证实了@dhg 和@Nicolas 的断言,即没有制作完整的副本,这解决了所提出的具体案例的问题。