web-dev-qa-db-fra.com

Java 8 Stream Map <K, V> to List <T>

Étant donné que j'ai une fonction qui prend deux paramètres et renvoie une valeur, est-il possible de convertir une carte en liste dans un flux en tant qu'opération non terminale? La recherche I cam la plus proche consiste à utiliser forEach sur la carte pour créer des instances et les ajouter à une liste prédéfinie, puis démarrer un nouveau flux à partir de cette liste. Ou ai-je juste raté quelque chose?

Par exemple: Le classique "trouver les 3 mots les plus fréquents dans une longue liste de mots"

wordList.stream().collect(groupingBy(Function.identity, Collectors.counting))).

(maintenant je veux diffuser l'entrée de cette carte)

sorted((a,b) -> a.getValue().compareTo(b.getValue))).limit(3).forEach(print...
23
JamesCherrill

Vous devriez obtenir le entrySet de la carte et coller les entrées aux appels de votre fonction binaire:

inputMap.entrySet().stream().map(e->myFun(e.getKey(),e.getValue()));

Le résultat de ce qui précède est un flux d'instances T.

Mise à jour

Votre exemple supplémentaire confirme ce qui a été discuté dans les commentaires ci-dessous: group by et sort sont par nature des opérations terminales. Ils doivent être effectués en entier pour pouvoir produire même le premier élément de la sortie, donc les impliquer en tant qu'opérations non terminales n'achète rien en termes de performances/empreinte mémoire.

Il arrive que Java 8 définit sorted comme une opération non terminale, cependant cette décision pourrait conduire à du code trompeur car l'opération se bloquera jusqu'à ce qu'elle ait reçu tous les éléments en amont, et devra les conserver tous lors de la réception.

53
Marko Topolnik