Проверьте, имеет ли список пользовательских объектов одинаковое значение для свойства в 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
}