Эффективно «модифицируя» ImmutableMap

В настоящее время мы используем Guava для его неизменных коллекций, но я с удивлением обнаружил, что на их картах нет методов, позволяющих легко создавать новые карты с незначительными изменениями. Кроме того, их конструктор не позволяет назначать новые значения ключам или удалять ключи.

Так что, если бы я хотел изменить только одно значение, вот что я хотел бы сделать:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */;
ImmutableMap<Guid, ImmutableMap<String, Integer>> modifiedMap =
    originalMap.cloneAndPut(key, value);

Вот что, похоже, ожидает от меня Гуава:

ImmutableMap<Guid, ImmutableMap<String, Integer>> originalMap = /* get the map */;
Map<Guid, ImmutableMap<String, Integer>> mutableCopy = new LinkedHashMap<>(originalMap);
mutableCopy.put(key, value);
originalMap = ImmutableMap.copyOf(mutableCopy);
/* put the map back */

Делая это, я получаю новую копию карты с модификацией, которую я хочу. Оригинальная копия не тронута, и я буду использовать атомарную ссылку, чтобы вернуть вещи назад, чтобы вся установка была поточно-ориентированной.

Это просто медленно.

Здесь много потраченного впустую копирования. Предположим, на карте есть 1024 ведра. Это 1023 сегмента, которые вы создаете без необходимости заново (по два раза в каждом), когда вы могли использовать эти неизменяемые сегменты как есть и клонировать только один из них.

Так что я думаю:

Есть ли метод утилит Guava, похороненный где-нибудь для такого рода вещей? (Это не в Картах или в ImmutableMap.Builder.)

Есть ли какая-нибудь другая библиотека Java, которая правильно понимает подобные вещи? У меня сложилось впечатление, что у Clojure есть такая штука под капотом, но мы пока не готовы переключать языки ...

Ответы на вопрос(1)

Ваш ответ на вопрос