Мой существующий случай использования довольно тривиален, либо изменчивая, либо неизменяемая Карта сделает трюк.
Имейте метод, который берет неизменяемую карту, которая затем вызывает сторонний API-метод, который также берет неизменяемую карту.
def doFoo(foo: String = "default", params: Map[String, Any] = Map()) {
val newMap =
if(someCondition) params + ("foo" -> foo) else params
api.doSomething(newMap)
}
Карта, о которой идет речь, обычно будет довольно небольшой, в лучшем случае может быть встроенный список экземпляров класса case, макс. Таким образом, опять же, предположим, что в этом случае маловероятно, чтобы в нем не было неизменяемости (т.е. Имело по существу 2 экземпляра Карты через новую копию newMap).
Тем не менее, это немного меня укусило, скопировав карту, чтобы получить новую карту с несколькими привязанными к ней символами k- > v.
Я мог бы пойти mutable и params.put("bar", bar)
и т.д. для записей, которые я хочу использовать, а затем params.toMap
, чтобы преобразовать в неизменяемый для вызова api, то есть вариант. но затем мне приходится импортировать и передавать измененные карты, что немного хлопотно по сравнению с тем, что происходит с неизменяемой картой Scala по умолчанию.
Итак, каковы общие рекомендации, когда оправдано/хорошая практика использования изменчивой карты над неизменяемыми Картами?
Спасибо
ИЗМЕНИТЬ Таким образом, кажется, что операция добавления на неизменяемом карте занимает почти постоянное время, подтверждая утверждение @dhg и @Nicolas о том, что полная копия не создана, что решает проблему для конкретного представленного случая.