2012-07-20 8 views
15

Necesito agregar una llave a Guava Multimap con una colección vacía como valor. ¿Cómo logro esto?Agregando una llave con un valor vacío a Guava Multimap

yo probamos este:

map.put("my key", null); 

pero llamar get() devuelve una lista con un elemento, que es nulo. Trabajé alrededor de esto haciendo lo siguiente:

map.putAll("my key2", new ArrayList()) 

pero me pregunto si esto es algo malo de hacer? Sé que Guava elimina automáticamente una clave cuando se elimina el último valor para mantener containsKey() consistente. ¿Cuál es mi mejor opción aquí?

+2

¿Qué tal si nos dice * por qué * siente que necesita hacer que un Multimap se comporte de una manera que no fue intencionada? –

+4

Es solo la naturaleza de los datos. Tengo un juego de llaves, algunas de las cuales tienen valores asociados con ellas, y algunas otras que no. (Las claves/valores reales provienen de un DB). Si este es un mal caso de uso para Multimap, está bien, estoy abierto a otras soluciones. La impl original en este código usaba un Map > y cambiar a Multimap parecía natural. –

Respuesta

23

Multimapdeliberadamente prohíbe este enfoque, y la solución propuesta no es operativa, en realidad no hará nada.

La forma en que Multimap funciona es que multimap.get(key) nunca devuelve nulo, pero siempre devuelve cierta colección, posiblemente vacía. (Sin embargo, la aplicación de respaldo Multimap probablemente en realidad no guarde nada para esa clave, y si una clave no está asignado a una colecciónno vacío, por ejemplo, no aparecerá en el keySet(). Multimap is not a Map<K, Collection<V>>.)

Si desea asignar a una colección vacía, debe usar Map<K, List<V>>.

8

Como cubre javadoc, un multimapa es conceptualmente un conjunto de pares clave-valor donde las claves no son necesariamente únicas, por ejemplo a = 1, a = 2, b = 3. Si no hay valores asociados con a, entonces no hay pares clave-valor para a, por lo que a no existe en el multimapa.

Una cosa que puede hacer es mantener un Set<K> por separado para todo el universo de claves que le interesan, o simplemente para mantener las claves adicionales que no corresponden a ningún valor. Otra es usar un Map<K, Collection<V>>, o un Map<K, Something> donde Something contiene una colección que podría estar vacía o no.

Cuestiones relacionadas