it-swarm.com.de

So konvertieren Sie Map in List 8 in Java

Wie konvertiert man einen Map<String, Double> in List<Pair<String, Double>> in Java 8?

Ich habe diese Implementierung geschrieben, ist aber nicht effizient

Map<String, Double> implicitDataSum = new ConcurrentHashMap<>();
//....
List<Pair<String, Double>> mostRelevantTitles = new ArrayList<>();
implicitDataSum.entrySet().stream().
                .sorted(Comparator.comparing(e -> -e.getValue()))
                .forEachOrdered(e -> mostRelevantTitles.add(new Pair<>(e.getKey(), e.getValue())));

return mostRelevantTitles;

Ich weiß, dass es mit .collect(Collectors.someMethod()) funktionieren sollte. Aber ich verstehe nicht, wie das geht.

12
Yakiv Holovko

Nun, Sie möchten Pair Elemente in einer List sammeln. Das bedeutet, dass Sie Ihren Stream<Map.Entry<String, Double>> in einen Stream<Pair<String, Double>> abbilden müssen.

Dies geschieht mit der Operation map :

Gibt einen Stream zurück, der aus den Ergebnissen der Anwendung der angegebenen Funktion auf die Elemente dieses Streams besteht. 

In diesem Fall ist die Funktion eine Funktion, die einen Map.Entry<String, Double> in einen Pair<String, Double> umwandelt.

Zum Schluss möchten Sie das in einer List sammeln, damit wir den eingebauten toList() collector verwenden können.

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet()
                   .stream()
                   .sorted(Comparator.comparing(e -> -e.getValue()))
                   .map(e -> new Pair<>(e.getKey(), e.getValue()))
                   .collect(Collectors.toList());

Beachten Sie, dass Sie den Komparator Comparator.comparing(e -> -e.getValue()) durch Map.Entry.comparingByValue(Comparator.reverseOrder()) ersetzen können.

19
Tunaki

Wenn Sie effiziente Implementierung wünschen, sollten Sie Folgendes berücksichtigen:

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet()
                   .stream()
                   .map(e -> new Pair<>(e.getKey(), e.getValue()))
                   .collect(Collectors.toList());
mostRelevantTitles.sort(Comparators.comparing(Pair::getSecond, Comparator.reverseOrder()));

Ich gehe davon aus, dass Ihre Pair-Klasse getSecond-Getter hat.

Mit dem sorted() stream Pipeline-Schritt erstellen Sie einen Zwischenspeicher, speichern alles in diesen Puffer, konvertieren ihn in ein Array, sortieren dieses Array und speichern das Ergebnis dann in das ArrayList. Mein Ansatz ist zwar weniger funktionsfähig, speichert Daten jedoch direkt im Ziel ArrayList und sortiert sie dann ohne zusätzliches Kopieren direkt an Ort und Stelle. Meine Lösung würde also weniger Zeit und Zwischenspeicher benötigen.

6
Tagir Valeev
    public List<TeamResult> process(final Map<String, Team> aggregatedMap) {
   return aggregatedMap.entrySet()
                       .stream()
                       .map(e -> new TeamResult(e.getKey(),e.getValue()))
                       .collect(Collectors.toList());
    }
1
ABHAY JOHRI