arraylist—检查自定义对象列表是否与Java8中的属性具有相同的值

iqjalb3h  于 2021-07-12  发布在  Java
关注(0)|答案(5)|浏览(395)

我刚接触Java8。我有一个类型a的自定义对象列表,其中a如下所示:

class A {
      int id;
      String name;
 }

我想确定该列表中的所有对象是否具有相同的名称。我可以通过遍历列表并捕获名称的前一个和当前值来实现。在这种情况下,我发现了如何计算列表中的自定义对象的数量,这些对象的一个属性具有相同的值。但是在Java8中,有没有更好的方法使用流来实现同样的功能呢?

ercv8c1e

ercv8c1e1#

一种方法是获取第一个列表的名称并调用 allMatch 检查一下。

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

lnxxn5zx2#

你可以 mapA --> String ,应用 distinct 中间操作,利用 limit(2) 在可能的情况下启用优化,然后检查 count 小于或等于 1 在这种情况下,所有对象都有相同的名称,如果没有,则它们不都有相同的名称。

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

在上面的示例中,我们利用 limit(2) 操作,以便我们在找到两个不同的对象名时立即停止。

r7s23pms

r7s23pms3#

另一种方法是使用

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

当然,您需要为“name”字段添加getter

cig3rfwq

cig3rfwq4#

另一个选择是使用分区。分区是一种特殊的分组,在这种分组中,生成的Map最多包含两个不同的组—一个为真,一个为假。
通过这个,你可以得到匹配和不匹配的数目

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

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

使用takewhile takewhile的java9将获取所有值,直到 predicate 返回false。这类似于while循环中的break语句

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 
        }
wgxvkvu9

wgxvkvu95#

或使用 groupingBy 然后检查 entrySet 大小。

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

相关问题