2012-03-28 20 views
11

Me gusta mucho la clase Multimap de la biblioteca google guava. Es un tipo de mapa donde puede agregar múltiples valores para una clave, por lo que efectivamente se asigna desde una clave a una colección de algún tipo. Lo que más me gusta especialmente es la función Multimaps.index() que toma un Iterable y una función clave y devuelve un Multimap que agrupa (o indexa o mapea) los elementos del Iterable por el valor que devuelve la función para cada uno de esos elementos.¿Por qué guava Multimap.values ​​() devuelve una colección plana en lugar de una colección de colecciones?

Lo que me parece un poco extraño es que Multimap.values() devuelve una colección plana en lugar de una colección de colecciones? Entonces la agrupación que me dio la función de índice se pierde una vez Ì recuperar los valores. Puedo eludir ese problema llamando al Multimap.asMap() y luego llamar a values ​​() sobre eso.

¿Alguien sabe por qué puede tener sentido que Multimap se comporte de esa manera?

Respuesta

13

Multimap.asMap().values() no es una forma alrededor el problema - fue deliberado que proporciona Multimap dos formas de acceder a ella, a través de la obtención de un Collection<Collection<V>>asMap().values() y conseguir el Collection<V> aplanado con values().

manera más general, Multimap intentos no ser sólo "un mapa de colecciones," sino más bien "de manera general a asociar teclas con varios valores." Entonces obtienes el método entries() además de values() y keys(). La vista asMap() proporciona una forma de tratarla como un "mapa para colecciones", pero tiene una semántica muy diferente que no siempre es lo que está buscando.

En cualquier caso, el método values está destinado a llenar un nicho diferente del que se rellena con asMap().values().

+0

Agrupar es lo que generalmente uso Multimap, así que por 'problema' me refería al problema de mi dominio, no al problema de la API de Multimap. No debería sonar como si estuviera criticando la API. Simplemente no entendí la filosofía detrás de esto. Gracias por tu respuesta. – nansen

+2

@nansen: No es como si Multimap intentara ocultar que los dos conceptos se superponen (por ejemplo, siempre puede iterar a través de 'keys()' y hacer 'get (key)' para obtener la colección de valores para esa clave). El entendimiento es simplemente que si solicita todos los valores en el multimapa, no le importan las claves asociadas, al igual que con un mapa normal. Y para todos los demás casos, le ofrece una vista en vivo para verlo como un 'Mapa > '. Te das cuenta de que 'asMap' no hace ninguna copia, ¿verdad? Es solo una vista diferente de los mismos datos, por lo que la sobrecarga es insignificante. –

+1

Me gusta esta visión de las cosas porque expresa un principio clave de reutilización. Como dice Alan Perlis: "Es mejor tener 100 funciones operando en una estructura de datos que 10 funciones en 10 estructuras de datos." – nansen

6

¿Alguien sabe por qué puede tener sentido que Multimap se comporte de esa manera?

Un Multimap debe verse como un mapa normal, donde las claves no tienen que ser exclusivas.

Key  Val 
a -> 1 
b -> 2 
a -> 3 

Values: {1, 2, 3} 
+1

Creo que lo que obtienes es que un mapa * ordinario * no asocia los valores devueltos de 'values ​​()' con sus claves (además del orden de iteración), entonces ¿por qué un Multimap debería apartarse de esa convención? Y si es así, estoy de acuerdo. –

+0

Sip. Esa es otra forma de decirlo. – aioobe

Cuestiones relacionadas