Мой нынешний вариант использования довольно тривиален, изменяемая или неизменяемая карта подойдет.
Имейте метод, который принимает неизменяемую карту, которая затем вызывает сторонний метод 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 экземпляра Map через копию newMap val).
Тем не менее, это меня немного раздражает, копируя карту только для того, чтобы получить новую карту с несколькими прикрепленными к ней записями k-> v.
Я мог бы использовать изменяемые и params.put("bar", bar)
и т. Д. Для записей, которые я хочу добавить, а затем params.toMap
, чтобы преобразовать их в неизменяемые для вызова api, это вариант. но затем мне нужно импортировать и передавать изменяемые карты, что немного хлопотно по сравнению с использованием неизменяемой карты Scala по умолчанию.
Итак, каковы общие рекомендации, когда оправдано / рекомендуется использовать изменяемую карту вместо неизменяемой карты?
Спасибо
РЕДАКТИРОВАТЬ. Таким образом, похоже, что операция добавления к неизменяемой карте занимает почти постоянное время, подтверждая утверждение @ dhg и @ Nicolas о том, что полная копия не создается, что решает проблему для конкретного представленного случая.