2012-05-17 6 views
29

Jeśli chcę, aby utworzyć nowy Multimap prostych domyślnych, ja curently trzeba zrobić coś takiego:Kompaktowy sposób na tworzenie multimapsów Guava?

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(); 
        } 
       }); 

ponieważ Java nie można wywnioskować prawidłowe typy jeśli Maps.newHashMap służy do mapie podkładowej. Oczywiście można to refaktoryzować w osobną metodę, ale czy istnieje już sposób, aby napisać to bardziej zwięźle?

Odpowiedz

49

Dlaczego nie używasz ArrayListMultimap.create() do takiego prostego przypadku? Jest to domyślny sposób tworzenia prostego HashMap/ArrayList, który jest prawdopodobnie najczęściej używanym multimapem.

+2

Myślę, że masz na myśli 'ArrayListMultimap'.'HashMultimap' jest dla' HashMap'/'HashSet'. –

+0

Tak, chodzi mi o ArrayListMultimap. Dziękuję za edycję. –

+3

Ponieważ szukałem w niewłaściwej klasie ('Multimaps') :) –

2

Aby odpowiedzieć na problem z pierwotnym typem interferencji, można również określić typy ogólne w metodzie statycznej, używając Maps.<Key, Collection<Value>>newHashMap(), ale z pewnością nie jest to bardziej zwięzłe niż new HashMap<Key, Collection<Value>>() (może być bardziej spójne).

7

Występuje ten problem podczas pisania klientów i tworzenia map parametrów zapytań. Miłym zwięzły wzór Lubię konstruowania multimaps jest użycie ImmutableMultiMap#builder

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

W Javie 8 jest znacznie ładniejszy, dla wszystkich rodzajów multimaps. Jest to z dwóch powodów:

Wygląda to tak:

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

Oto kompaktowe rozwiązanie:

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

W Guava documentation stwierdza, że ​​metoda create popierane przez niektórych innych odpowiedzi "zostanie wkrótce przestarzałe" na korzyść różnych przedstawionych poniżej form i dlatego należy ich unikać.

Od Guava 21,0 roku, zalecanym sposobem tworzenia Multimap obiektu, gdzie wartości są przechowywane w ArrayList kolekcji jest następujący:

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

Można również użyć parametrów, jeśli chcesz określić oczekiwaną liczbę kluczy w swojej mapie i przewidywanej liczby wartości na klucz:

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

Wreszcie, można utworzyć nowy Multimap z exist ing przy użyciu tego konstruktu:

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

Jeśli chcesz użyć struktur danych innych niż ArrayLists w swojej Multimap można zastąpić wywołanie arrayListValues() przez liczbę pozostałych, wymienionych here.

Powiązane problemy