web-dev-qa-db-fra.com

Comment convertir la carte en liste en Java 8

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.

12
Yakiv Holovko

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()).

19
Tunaki

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.

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