3
votes

Comment regrouper une liste d'objets par un attribut, puis itérer les résultats en utilisant la paire (Clé, Valeur)?

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


1 commentaires

fait de la manière souhaitée: results.forEach ((key, value) -> {// logic});


3 Réponses :


3
votes

Utilisez

results.entrySet().forEach(entry -> {
     var key = entry.getKey();
     var value = entry.getValue();
//logic
});


5 commentaires

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 > entrée: results.entrySet ()) {String sessionId = entry.getKey (); Liste pageLogs = entry.getValue (); // logique} // cela a fonctionné



0
votes

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.


5 commentaires

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 ), 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. :)



2
votes

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 .forEach () 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");
           }};


0 commentaires