在Java 8中检查自定义对象列表是否具有相同属性值

28

我是Java 8的新手。我有一个由类型为A的自定义对象组成的列表,其中A的结构如下:

 class A {
      int id;
      String name;
 }

我想确定列表中的所有对象是否具有相同的名称。我可以通过迭代列表并捕获名称的前一个和当前值来实现。在这种情况下,我发现如何计算列表中具有某个属性相同值的自定义对象的数量。但是,在Java 8中是否有更好的方法使用流来执行相同的操作?


你的实际输出是什么样子? - Tim Biegeleisen
实际输出要么是true(真)/false(假)。 - Joy
1
或者使用 grouppingBy 然后检查大小。list.stream() .collect(Collectors.groupingBy(A::getName, Collectors.toList())) - Hadi J
5个回答

52
你可以从 A 映射到 String ,应用 distinct 中间操作,使用 limit(2) 来尽可能地进行优化,然后检查 count 是否小于或等于 1 ,在这种情况下所有对象都具有相同的名称,如果不是,则它们的名称不全相同。
boolean result = myList.stream()
                       .map(A::getName)
                       .distinct()
                       .limit(2)
                       .count() <= 1;

通过以上示例,我们利用limit(2)操作,以便在找到两个不同的对象名称后停止。


34

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

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

3
在我看来,使用流的最高效和清晰的解决方案。allMatch会在找到一个不匹配的元素后立即终止。 - Stephen C
1
如果名字可以为空,则添加一个“if”语句来检查firstName不为空,并将其更改为allMatch(x -> firstName.equals(x.name));。如果firstName仍然为空,则还必须检查所有其他名称是否为空。看起来Aomine的解决方案已经涵盖了这些情况。 - James

12

另一种方法是使用计算不同名称的数量

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

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


2

使用分区是另一种选择。分区是一种特殊的分组方式,其结果映射最多包含两个不同的组 - 一个为真,一个为假。

通过这种方式,您可以得到匹配和不匹配的数量。

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

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

Java 9使用takeWhile takewhile会一直取值,直到谓词返回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 
        }

1
或者使用 groupingBy 然后检查 entrySet 的大小。
boolean b  = list.stream()
             .collect(Collectors.groupingBy(A::getName, 
             Collectors.toList())).entrySet().size() == 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接