2012-02-01 15 views
13

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

Así que si quería modificar un solo valor, esto es lo que me gustaría ser capaz de hacer:

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

Esto es lo que se ve como la guayaba se 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 deseo. La copia original está intacta y usaré una referencia atómica para volverla a colocar, de modo que toda la configuración sea segura para subprocesos.

Es simplemente lento.

Aquí se esconden muchas copias desperdiciadas. Supongamos que hay 1.024 cubos en el mapa. Eso es 1.023 cubos que está creando innecesariamente de nuevo (dos veces cada uno, también), cuando podría haber utilizado esos cubos inmutables tal como están y haber clonado solo uno de ellos.

así que supongo:

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

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

+0

Por favor, presente una solicitud de función si lo desea, pero es probable que realmente esté buscando una biblioteca de estructuras de datos funcionales adecuadas. –

+0

Sí. Esto es algo que se puede hacer, eso es lo que hacen los lenguajes funcionales, pero no es eso para lo que Guava está ahí. Guava, p. Ej. 'ImmutableMap' se basa en hash, y eso no respaldará la actualización eficiente, no sin un precio significativo en la velocidad de consulta. –

+0

Reformule: las colecciones inmutables de Guava están diseñadas para consultas/iteraciones rápidas y consumo mínimo de memoria. Eso significa hash y arrays, que no te permitirán admitir actualizaciones no destructivas eficientes. –

Respuesta

6

un poco inesperado del map of Functional Java es mutable como guayaba de. La lista es inmutable, aunque como era de esperar.

Google para "persistent collection java" traído a colación: pcollections. Hay un Map implementation.

Antes de utilizar cualquier otra implementación, compararía las características de memoria y rendimiento con Guava. No me sorprendería si todavía es mejor.

Cuestiones relacionadas