2014-06-19 6 views
6

Ich versuche, eine HashMap zu schaffen, die eine ganze Zahl als Schlüssel und eine Liste von Strings als Wert enthält:Java 8 Karte merge Methode

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

Ich mag es irgendwie effizient füllen. Was ich kam war:

map.merge(search_key, new ArrayList<>(Arrays.asList(new_string)), (v1, v2) -> { 
        v1.addAll(v2); 
        return v1; 
       }); 

Dieser Code ist klein und elegant aber mein Problem ist, dass ich eine neue Liste in jedem Aufruf erstellen. Gibt es eine Möglichkeit, dass ich die Listenerstellung nach der ersten Zusammenführung überspringen kann, und einfach new_string in der ersten erstellten Liste hinzufügen?

+1

„Dieser Code ist klein und elegant“, aber gebrochen. Der Aufruf von 'addAll' im Ergebnis von' Arrays.asList' funktioniert nicht ... – Holger

+0

@Holger Sie haben Recht. Mein Fehler ist, dass Arrays.asList (new_string) eine feste Liste gibt, die ich beheben werde. –

Antwort

16

Sie sollten die Methode Map::computeIfAbsent verwenden, um eine Liste träge zu erstellen:

map.computeIfAbsent(search_key, k -> new ArrayList<>()) 
    .add(new_string);