Java Streams - Collectionner à une carte avec GroupingBy et comptage, Mais le comte 0 Si un champ est nul spécifique

Melih:

Pour protéger la question de « chasseurs » en double, je dois dire que je ne pensais pas que la solution que je cherche est le filtrage. Je l'ai fait ma recherche, ne rencontre jamais une réponse mentionner le filtrage.

J'ai une liste d'objets avec une classe comme ça:

class Person {
  String gender;
  String income;
  String petName;
}

Je veux recueillir cette liste dans une carte, le sexe groupingBy, et en comptant les animaux qu'ils ont, et besoin de cours pour passer 0 si Petname est nulle.

Map<String, Long> mapping = people
  .stream()
  .collect(Collectors.groupingBy(Person::gender, Collectors.counting());

Sans la mise en œuvre de l'interface Collector et il est 5 méthodes (Parce que je suis déjà en train de se débarrasser d'un autre collecteur personnalisé) Comment puis - je faire cela compte pas si l'objet de ce petNamechamp est null.

Je peux bénéficier de Java-11

Ravindra Ranwala:

Tout d'abord, groupe toutes les personnes de leur sexe, puis utilisez le collecteur filtrant pour filtrer les personnes avec des noms nuls. Enfin, utilisez le collecteur en aval de comptage pour compter le nombre d'éléments appartiennent à chaque catégorie. Voici à quoi il ressemble.

Map<String, Long> peopleCntByGender = people.stream()
    .collect(Collectors.groupingBy(Person::getGender, 
        Collectors.filtering(p -> p.getPetName() != null, 
            Collectors.counting())));

Cependant, le collecteur filtrant est seulement disponible en Java9, donc si vous utilisez Java8 et ne peut pas migrer vers Java9 facilement, envisager d' écrire votre propre coutume filteringcollecteur et de l' utiliser ici. Cette réponse ou 9 JDK Le code source peut aider.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=312109&siteId=1
conseillé
Classement