web-dev-qa-db-fra.com

Vérifier si la liste d'objets personnalisés a la même valeur pour une propriété dans Java 8

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 les noms précédents et actuels. Dans ce contexte, j'ai trouvé Comment compter le nombre d'objets personnalisés dans la liste ayant la même valeur pour l'un de ses attributs . Mais existe-t-il une meilleure façon de faire la même chose avec Java 8 en utilisant stream?

6
Joy

Une solution consiste à obtenir le nom de la première liste et à appeler allMatch pour vérifier.

String firstName = yourListOfAs.get(0).name;
boolean allSameName = yourListOfAs.stream().allMatch(x -> x.name.equals(firstName));
5
Sweeper

Vous pouvez map à partir de A -> String, appliquer l'opération intermédiaire distinct, utiliser limit(2) pour activer l'optimisation, dans la mesure du possible, puis vérifier si count est inférieur ou égal à 1, auquel cas tous les objets ont le même nom. tous n'ont pas le même nom.

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

Avec l'exemple présenté ci-dessus, nous nous appuyons sur l'opération limit(2) pour nous arrêter dès que nous trouvons deux noms d'objet distincts.

8
Aomine

Ou utilisez groupingBy puis cochez entrySet size.

boolean b  = list.stream()
             .collect(Collectors.groupingBy(A::getName, 
             Collectors.toList())).entrySet().size() == 1;
0
Hadi J

Une option supplémentaire en utilisant Partitioning . 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 ceci, vous pouvez obtenir le nombre d'appariement et ne correspond pas

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

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

Java 9 utilisant takeWhile takewhile prendra toutes les valeurs jusqu'à ce que le prédicat retourne 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

une autre méthode consiste à calculer le nombre de noms distincts en utilisant

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

bien sûr, vous devez ajouter le getter pour le champ 'name'

0
Alex M981