Проверьте, имеет ли список пользовательских объектов одинаковое значение для свойства в Java 8

Я новичок в Java 8. У меня есть список пользовательских объектов типа A, где A, как показано ниже:

 class A {
      int id;
      String name;
 }

Я хотел бы определить, имеют ли все объекты в этом списке одинаковое имя. Я могу сделать это, повторяя список и захватывая предыдущее и текущее значение имен. В этом контексте, я нашел как посчитать количество пользовательских объектов в списке, которые имеют одинаковое значение для одного из своих атрибутов. Но есть ли лучший способ сделать то же самое в Java 8 с помощью ручей?

5 ответов


один из способов-получить имя первого списка и вызвать allMatch и проверьте это.

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

вы можете map С A -->String применить distinct промежуточная операция, использовать limit(2) включить оптимизацию там, где это возможно, а затем проверить, если count меньше или равно 1 в этом случае все объекты имеют одинаковое имя, а если нет, то они не все имеют одинаковое имя.

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

С примером, показанным выше, мы используем limit(2) операция, чтобы мы остановились, как только найдем два разных имени объекта.


другой способ-вычислить количество различных имен, используя

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

конечно, вам нужно добавить геттер для поля "имя"


или использовать groupingBy затем проверить entrySet размер.

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

еще один вариант с использованием перегородки. Секционирование-это особый вид группировки, в котором результирующая карта содержит не более двух различных групп-одну для true и одну для false.

этим Вы можете получить количество совпадений и не совпадающих

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

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

Java 9 с помощью takeWhile takewhile будет принимать все значения, пока предикат не вернет false. это похоже на оператор break в while loop

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 
        }