Modificando eficientemente un ImmutableMap

Actualmente estamos usando Guava para sus colecciones inmutables, pero me sorprendió descubrir que sus mapas no tienen métodos para crear fácilmente nuevos mapas con modificaciones menores. Y además de eso, su generador no permite asignar nuevos valores a las claves o eliminar claves.

Así que si quisiera modificar solo un valor, esto es lo que me gustaría poder hacer:

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

Esto es lo que parece que Guava espera que haga:

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 */

Al hacer esto, obtengo una nueva copia del mapa con la modificación que quiero. La copia original no ha sido tocada y utilizaré una referencia atómica para volver a colocarla para que toda la configuración sea segura para subprocesos.

Es lento.

Hay mucha copia desperdiciada debajo de las cubiertas aquí. Supongamos que hay 1.024 cubos en el mapa. Son 1.023 cubos que está creando innecesariamente de nuevo (dos veces cada uno, también), cuando podría haber usado esos cubos inmutables tal cual y clonado solo uno de ellos.

Así que supongo:

¿Existe un método de utilidad de guayaba enterrado en algún lugar para este tipo de cosas? (No está en Maps ni en ImmutableMap.Builder).

¿Hay alguna otra biblioteca de Java que haga este tipo de cosas bien? Tengo la impresión de que Clojure tiene este tipo de cosas bajo el capó, pero todavía no estamos listos para cambiar de idioma ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta