2012-05-17 17 views
29

Si quiero crear un nuevo Multimapa con valores predeterminados simples, que curently tienen que hacer algo como:¿Forma compacta de crear Guava Multimaps?

private final Multimap<Key, Value> providersToClasses = Multimaps 
     .newListMultimap(
       new HashMap<Key, Collection<Value>>(), 
       new Supplier<List<Value>>() { 
        @Override 
        public List<Value> get() { 
         return Lists.newArrayList(); 
        } 
       }); 

porque Java no puede inferir los tipos correctos si Maps.newHashMap se utiliza para la correlación de respaldo. Por supuesto, esto se puede refactorizar en un método separado, pero ¿hay alguna forma de escribirlo de manera más concisa?

Respuesta

49

¿Por qué no está usando ArrayListMultimap.create() para un caso tan simple? Es la forma predeterminada de crear el HashMap/ArrayList simple que es probablemente el multimapa más utilizado.

+2

Creo que te refieres a 'ArrayListMultimap'.'HashMultimap' es para' HashMap'/'HashSet'. –

+0

Sí, me refería a ArrayListMultimap. Gracias por la edición. –

+3

Porque estaba buscando en la clase incorrecta ('Multimaps') :) –

2

Para responder al problema de inferencia de tipo original, también puede especificar los tipos genéricos en un método estático usando Maps.<Key, Collection<Value>>newHashMap(), pero ciertamente no es más conciso que new HashMap<Key, Collection<Value>>() (puede ser más consistente).

7

Me encuentro con este problema al escribir clientes y crear mapas de parámetros de consulta. Un patrón sucinto agradable me gusta para la construcción de Multimapas es utilizar ImmutableMultiMap#builder

Multimap<String, String> queryParams = 
    ImmutableMultimap.<String, String>builder() 
    .put("key-1", "value-1") 
    .put("key-1", "value-2") 
    .build(); 
3

En Java 8 esto es mucho más agradable, para todo tipo de Multimapas. Esto es por dos razones:

Parece que este:

Multimap<Key, Value> providersToClasses = 
    Multimaps.newListMultimap(new HashMap<>(), ArrayList::new); 
4

Aquí es una solución compacta:

Multimap<Integer, String> multi = HashMultimap.create(); 
6

Los Guava documentation estados que el método create defendida por algunos otros respuestas "pronto quedará obsoleta" a favor de las diferentes formas presentadas a continuación y, por lo tanto, deben evitarse.

De guayaba 21.0 en adelante, la forma recomendada de crear un objeto Multimap donde se almacenan los valores en ArrayList colecciones es la siguiente:

MultimapBuilder.hashKeys().arrayListValues().build(); 

También puede utilizar parámetros si desea especificar el número esperado de llaves en su mapa y el número esperado de valores por clave:

MultimapBuilder.hashKeys(expectedKeys).arrayListValues(expectedValuesPerKey).build(); 

por último, puede crear un nuevo Multimap de uno ya existente ing una utilizando este constructo:

MultimapBuilder.hashKeys().arrayListValues().build(multimap); 

Si desea utilizar estructuras de datos que no sean ArrayLists en su Multimap, puede reemplazar la llamada a arrayListValues() por un número de otros, que se enumeran here.

Cuestiones relacionadas