2016-07-29 14 views
3

Ich habe eine Karte wie folgt definiert:prüft Wert (Liste) Existenz in unveränderlicher Karte Baumeister

Map<String, List<SomeClass>> map = new HashMap<>(); 

ich es dachte, schön wäre es unveränderlich zu machen, indem ImmutableMap.Builder Konstrukt. Aber in meinem Fall, wenn neue Elemente in der Karte setzen, ich brauche für ihre Existenz zuerst zu überprüfen, ob die Liste für gegebenen Schlüssel nicht vorhanden ist, erstellen und fügt Element hinzu:

for(final SomeClass elem : elements){ 
    final String key = elem.getKey(); 
    if(!map.containsKey(target)){ 
     map.put(key, new LinkedList<SomeClass>()); 
    } 
    map.get(key).add(elem); 
} 

Wenn es Ziel Geben Sie die Karte ein, ich muss eine neue Liste erstellen und dann ein Element zu dieser Liste hinzufügen.

Gibt es eine Möglichkeit, diese Karte unveränderlich zu machen, ohne unnötigen Code wie mehr Schleifen zu verwenden, um zuerst Listen für Zielschlüssel zu initialisieren?

Btw. Ich benutze Java 7

Antwort

7

Sie sollten ListMultimap hier verwenden. Mit ImmutableListMultimap.builder():

ImmutableListMultimap.Builder<String, SomeClass> builder = ImmutableListMultimap.builder(); 
for (final SomeClass elem : elements) { 
    final String key = elem.getKey(); 
    builder.put(key, elem); 
} 
ImmutableListMultimap<String, SomeClass> multimap = builder.build(); 

Aber warten Sie! Es gibt integrierte Methode für Ihren Anwendungsfall - Multimaps#index(Iterable, Function):

ImmutableListMultimap<String, SomeClass> multimap = Multimaps.index(
    elements, 
    new Function<SomeClass, String>() { 
     @Override public String apply(final SomeClass element) { 
      return element.getKey(); 
     } 
    }); 

(In Java 8):

ImmutableListMultimap<String, SomeClass> multimap = 
    Multimaps.index(elements, SomeClass::getKey);