it-swarm.com.ru

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

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

 class A {
      int id;
      String name;
 }

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

6
Joy

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

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

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

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

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

8
Aomine

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

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

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

таким образом, вы можете получить количество совпадающих и не совпадающих 

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

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

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

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

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

0
Alex M981