繁体   English   中英

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

[英]Check whether list of custom objects have same value for a property in Java 8

我是 Java 8 的新手。我有一个类型 A 的自定义对象列表,其中 A 如下所示:

 class A {
      int id;
      String name;
 }

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

您可以从A --> String map ,应用distinct中间操作,在可能的情况下利用limit(2)启用优化,然后检查count是否小于或等于1在这种情况下所有对象都具有相同的名称,如果不是那么它们并不都具有相同的名称。

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

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

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

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

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

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

当然你需要为'name'字段添加getter

使用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。 这类似于 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 
        }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM