Comment convertir un Map<String, Double>
en List<Pair<String, Double>>
en Java 8?
J'ai écrit cette implémentation, mais ce n'est pas efficace
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;
Je sais que cela devrait fonctionner en utilisant .collect(Collectors.someMethod())
. Mais je ne comprends pas comment faire ça.
Eh bien, vous voulez collecter des éléments Pair
dans une List
. Cela signifie que vous devez mapper votre Stream<Map.Entry<String, Double>>
dans un Stream<Pair<String, Double>>
.
Ceci est fait avec l'opération map
:
Renvoie un flux contenant les résultats de l'application de la fonction donnée aux éléments de ce flux.
Dans ce cas, la fonction sera une fonction convertissant un Map.Entry<String, Double>
en un Pair<String, Double>
.
Enfin, vous souhaitez collecter cela dans une List
afin que nous puissions utiliser le collecteur toList()
intégré.
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());
Notez que vous pouvez remplacer le comparateur Comparator.comparing(e -> -e.getValue())
par Map.Entry.comparingByValue(Comparator.reverseOrder())
.
Notez que si vous voulez efficient implementation, vous devriez considérer ceci:
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()));
Je suppose que votre classe Pair
a getSecond
getter.
A l’aide de l’étape de pipeline de flux sorted()
, vous créez le tampon intermédiaire, stockez tout dans ce tampon, le convertissez en tableau, triez ce tableau, puis stockez le résultat dans la variable ArrayList
. Mon approche, bien que moins fonctionnelle, stocke des données directement dans la variable ArrayList
cible, puis les trie sur place sans aucune copie supplémentaire. Ainsi, ma solution prendrait moins de temps et de mémoire intermédiaire.
public List<TeamResult> process(final Map<String, Team> aggregatedMap) {
return aggregatedMap.entrySet()
.stream()
.map(e -> new TeamResult(e.getKey(),e.getValue()))
.collect(Collectors.toList());
}