Je suis nouveau sur Java 8. J'ai une liste d'objets personnalisés de type A, où A est comme ci-dessous:

 class A {
      int id;
      String name;
 }

Je voudrais déterminer si tous les objets de cette liste ont le même nom. Je peux le faire en parcourant la liste et en capturant la valeur précédente et actuelle des noms. Dans ce contexte, j'ai trouvé Comment compter le nombre d'objets personnalisés dans la liste qui ont la même valeur pour l'un de ses attributs. Mais y a-t-il un meilleur moyen de faire la même chose en java 8 en utilisant stream?

14
Joy 30 déc. 2017 à 09:41

4 réponses

Meilleure réponse

Une façon est d'obtenir le nom de la première liste et d'appeler allMatch et de vérifier par rapport à cela.

String firstName = yourListOfAs.get(0).name;
boolean allSameName = yourListOfAs.stream().allMatch(x -> x.name.equals(firstName));
14
Sweeper 30 déc. 2017 à 06:46

Une autre option en utilisant Partitionnement . Le partitionnement est un type spécial de regroupement, dans lequel la carte résultante contient au plus deux groupes différents - un pour vrai et un pour faux.

Par cela, vous pouvez obtenir le nombre de correspondants et non correspondants

String firstName = yourListOfAs.get(0).name;

Map<Boolean, List<Employee>> partitioned =  employees.stream().collect(partitioningBy(e -> e.name==firstName));

Java 9 utilisant takeWhile take while prendra toutes les valeurs jusqu'à ce que le prédicat renvoie false. ceci est similaire à l'instruction break dans la boucle while

String firstName = yourListOfAs.get(0).name;        

        List<Employee> filterList =  employees.stream()
                                               .takeWhile(e->firstName.equals(e.name)).collect(Collectors.toList());
        if(filterList.size()==list.size())
        {
            //all objects have same values 
        }
0
Niraj Sonawane 30 déc. 2017 à 17:21

Une autre façon est de calculer le nombre de noms distincts en utilisant

boolean result = myList.stream().map(A::getName).distinct().count() == 1;

Bien sûr, vous devez ajouter un getter pour le champ 'nom'

1
Alex M981 30 déc. 2017 à 06:56

Ou utilisez groupingBy puis vérifiez la taille entrySet.

boolean b  = list.stream()
             .collect(Collectors.groupingBy(A::getName, 
             Collectors.toList())).entrySet().size() == 1;
0
Hadi J 30 déc. 2017 à 07:13