3 votes

Ce flux Java ne renvoie pas la valeur correcte

Je veux renvoyer le groupe d'âge, ou zéro s'il n'y a pas d'âge, mais la clé de la hashMap ne montre simplement pas l'âge 21-23 quand il n'y a pas d'âge

List users = Arrays.asList(
    new Personne(18, "", "123", 1),
    new Personne(19, "", "124", 0),
    new Personne(20, "", "125", 1),
    new Personne(24, "", "128", 0),
    new Personne(27, "", "129", 1)
); 
Map groupe2 = users.stream()
    .collect(Collectors.groupingBy(u -> {
            int age = u.getAge();
            if (age >= 18 && age <= 20) { 
                return "18-20"; 
            } else if (age >= 21 && age <= 23) { 
                return "21-23"; 
            } else if (age >= 24 && age <= 26) {
                return "24-26"; 
            } else {
                 return "autre"; 
            }
        }), Collectors.counting());

4voto

Broccoli_Salad Points 120

Vous pouvez créer un fournisseur par défaut qui renvoie 0 si le groupe est vide.

List utilisateurs = Arrays.asList(
    new Personne(18, "", "123", 1),
    new Personne(19, "", "124", 0),
    new Personne(20, "", "125", 1),
    new Personne(24, "", "128", 0),
    new Personne(27, "", "129", 1)
); 

// Créer une carte par défaut avec tous les groupes d'âge possibles et un compteur à zéro pour chaque groupe d'âge
Supplier> fournisseurCarteParDefaut = () -> Stream.of("18-20", "21-23", "24-26", "autre")
        .collect(Collectors.toMap(ageGroup -> ageGroup, ageGroup -> 0L));

Map carteCompteAge = utilisateurs.stream()
    .collect(Collectors.groupingBy(
            u -> {
                int age = u.getAge();
                if (age >= 18 && age <= 20) { return "18-20"; }
                else if (age >= 21 && age <= 23) { return "21-23"; }
                else if (age >= 24 && age <= 26) { return "24-26"; }
                else { return "autre"; }
            },
            fournisseurCarteParDefaut,
            Collectors.counting()
    ));

1voto

sachintha hewawasam Points 491

Vous pouvez initialiser la HashMap avec les groupes d'âge désirés et leurs comptes mis à zéro.

    Map group2 = new HashMap<>();
    group2.put("18-20", 0L);
    group2.put("21-23", 0L);
    group2.put("24-26", 0L);
    group2.put("else", 0L);

    // Mettre à jour les comptes des groupes d'âge en utilisant la liste des utilisateurs
    Map ageGroupCounts = users.stream()
        .collect(Collectors.groupingBy(u -> {
            int age = u.getAge();
            if (age >= 18 && age <= 20) {
                return "18-20";
            } else if (age >= 21 && age <= 23) {
                return "21-23";
            } else if (age >= 24 && age <= 26) {
                return "24-26";
            } else {
                return "else";
            }
        }, Collectors.counting()));

    // Fusionner la HashMap initialisée avec les comptes des groupes d'âge de la liste des utilisateurs
    group2.forEach((key, value) -> ageGroupCounts.merge(key, value, Long::sum));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X