2015-04-18 6 views
13

Ich habe eine Liste, die ich brauche, um es zuerst zu sortieren und dann in eine Karte mit seiner ID vs Name Karte zu konvertieren. Hier ist der Code, der die Arbeit erledigt, aber ---Konvertieren einer Sammlung in Map durch Sortieren mit Java 8 Streams

Map<Long, String> map = new LinkedHashMap<>(); 
list.stream().sorted(Comparator.comparing(Building::getName)).forEach(b-> map.put(b.getId(), b.getName())); 

ich denke, das den Job tun, aber ich frage mich, ob ich vermeiden kann verknüpfte Hashzuordnung hier erstellen und wie Phantasie funktionale Programmierung erledigen die Arbeit in einem Linie?

+2

Außerdem Wenn Sie 'collect' verwenden, sollten Sie darauf achten, dass' sorted (...) .forEach (...) 'falsch ist (obwohl es manchmal funktioniert). Was du wirklich meinst ist 'sortierte (...) .forEachOrdered (...)' ... – Holger

Antwort

40

Sie haben Collectors.toMap zu diesem Zweck:

Map<Long, String> map = 
    list.stream() 
     .sorted(Comparator.comparing(Building::getName)) 
     .collect(Collectors.toMap(Building::getId,Building::getName)); 

Wenn Sie die Karte Implementierung erzwingen wollen, dass dies wird instanziiert, verwenden:

Map<Long, String> map = 
    list.stream() 
     .sorted(Comparator.comparing(Building::getName)) 
     .collect(Collectors.toMap(Building::getId, 
            Building::getName, 
            (v1,v2)->v1, 
            LinkedHashMap::new)); 
+1

toMap wird dies in HashMap konvertieren oder? Was garantiert keine Sortierung? –

+4

@MohdAdnan Die zurückgegebene Implementierung ist nicht garantiert. Sie können die gewünschte Implementierung erzwingen, indem Sie die [4-Parameter-Version] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util) verwenden. function.function-java.util.function.Function-java.util.function.BinaryOperator-java.util.function.Supplier-). Mit dem letzten Parameter - dem Lieferanten - können Sie angeben, welche Map-Implementierung instanziiert werden soll. – Eran

+3

Bitte beachten Sie, dass diese Implementierung den zweiten Eintrag für den doppelten Schlüssel weglässt. – Masudul

0

Verwenden toMap() von java.util.stream.Collectors

Verwandte Themen