Неизменяемая карта Scala, когда переходить на изменяемую?

Мой нынешний вариант использования довольно тривиален, подойдет либо изменяемая, либо неизменная карта.

Имейте метод, который принимает неизменяемую карту, который затем вызывает сторонний метод 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 о том, что полная копия не создается, что решает проблему для представленного конкретного случая.

23
задан virtualeyes 13 April 2012 в 15:24
поделиться