2012-05-17 5 views
29

Wenn ich einen neuen Multimap mit einfachen Standardwerte erstellt werden soll, muss ich curently etwas tun:Kompakte Möglichkeit, Guava-Multimaps zu erstellen?

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

weil Java nicht die richtigen Typen ableiten, wenn Maps.newHashMap für die Trägerkarte verwendet wird. Natürlich kann dies in eine separate Methode umgestaltet werden, aber gibt es schon eine Möglichkeit, es prägnanter zu schreiben?

Antwort

49

Warum benutzen Sie nicht ArrayListMultimap.create() für solch einen einfachen Fall? Dies ist die Standardmethode zum Erstellen der einfachen HashMap/ArrayList, die wahrscheinlich die am häufigsten verwendete Multimap ist.

+2

Ich denke, du meinst 'ArrayListMultimap'.'HashMultimap' ist für' HashMap'/'HashSet'. –

+0

Ja, ich meinte ArrayListMultimap. Danke für die Bearbeitung. –

+3

Da ich in der falschen Klasse ('Multimaps') gesucht habe :) –

2

Um das ursprüngliche Inferenz-Problem zu beantworten, können Sie jedoch auch die generischen Typen für eine statische Methode mit Maps.<Key, Collection<Value>>newHashMap() angeben, aber es ist sicherlich nicht prägnanter als new HashMap<Key, Collection<Value>>() (es kann konsistenter sein).

7

Ich laufe auf dieses Problem beim Schreiben von Clients und Erstellen von Karten von Abfrageparametern. Ein schönes prägnante Muster Ich mag multimaps für die Konstruktion ist für alle Arten von multimaps ImmutableMultiMap#builder

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

In Java 8 das ist viel schöner, zu verwenden. Dies ist aus zwei Gründen:

Es sieht wie folgt aus:

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

Hier kompakte Lösung:

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

Die Guava documentation besagt, dass die create Methode von einigen anderen Antworten befürwortete "wird bald veraltet" zugunsten der verschiedenen unten dargestellten Formen und sollte daher vermieden werden.

Von Guava 21,0 ab, die empfohlene Art und Weise ein Multimap Objekt zu schaffen, in denen Werte in ArrayList Sammlungen gespeichert sind, ist die folgende:

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

Sie auch Parameter verwenden, wenn Sie die erwartete Anzahl angeben möchten der Schlüssel in der Karte und die erwartete Anzahl der Werte pro Schlüssel: Schließlich

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

, können Sie einen neuen Multimap von einem exist erstellen ein mit diesem Konstrukt ing:

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

Wenn Sie andere Datenstrukturen verwenden möchten als ArrayLists in Ihrem Multimap, Sie den Anruf arrayListValues() durch eine Reihe von anderen ersetzen können, aufgelistet here.

Verwandte Themen