Je veux grouper une liste d'objets par un attribut, puis itérer les résultats en utilisant la paire (Clé, Valeur).
J'ai trouvé le moyen dans Java 8 de grouper la liste d'objets avec un attribut comme suit
results.forEach((key,value) -> { //logic });
Mais les résultats n'auront que des ensembles d'entrées (ont des valeurs dans l'attribut entrySet). Le keySet et valueSet auront des valeurs nulles. Je veux répéter quelque chose comme
// filteredPageLog has the filtered results from PageLog entity. Map<String, List<PageLog>> results = filteredPageLog.stream().collect(Collectors.groupingBy(p -> p.getSessionId()));
3 Réponses :
Utilisez
results.entrySet().forEach(entry -> { var key = entry.getKey(); var value = entry.getValue(); //logic });
obtenir une exception de pointeur nul sur cette ligne "results.entrySet (). forEach (entrée -> {" @talex
@MohammedShirhaan, cela signifie que les résultats
sont nuls.
Le entrySet a des valeurs lorsque je débogue. @talex
@Qu'est-ce que null
alors?
for (Map.Entry
Il n'y a pas de tuples en Java. Ici vous pouvez trouver des explications plus détaillées. Vous pouvez parcourir des clés, des valeurs ou des entrées, mais pas des tuples.
Il n'y a pas de moyen de tuples?
Signifie qu'il n'y a pas de sucre syntaxique comme dans Scala, par exemple, voir alexecollins.com/java-tuples. En Java, vous ne pouvez pas écrire (clé, valeur) au lieu d'une entrée. Uniquement en tant que méthode lambda à surchargée, qui reçoit une interface fonctionnelle appropriée.
impossible d'écrire ne peut pas écrire (clé, valeur) au lieu de l'entrée
vous êtes sûr?
J'ai oublié map.forEach (BiConsumer Super K ,? super V>), votre réponse est parfaite. Donc, dans ce cas, lambda ressemble à un tuple à deux éléments)
exactement! ne vous inquiétez pas, je vérifiais votre concept. :)
Dummy map
:
map.entrySet().forEach((entry) -> { String k = entry.getKey(); String v= entry.getValue(); //logic goes here });
Vous pouvez le faire de deux manières:
1. Map
attend un BiConsumer super K ,? super V>
comme
argument, et la signature du résumé BiConsumer
méthode est accept (T t, U u)
.
map.forEach((keys,values) -> { String k = keys ; String v= values; //logic goes here });
2. Map .entrySet (). ForEach ()
attend un Consumer super T>
comme
argument, et la signature du résumé Consumer
méthode est accept (T t)
.
Map<String,String> map = new HashMap() {{ put("1","20"); put("2","30"); }};
fait de la manière souhaitée:
results.forEach ((key, value) -> {// logic});