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

Posted

技术标签:

【中文标题】检查自定义对象列表是不是与 Java 8 中的属性具有相同的值【英文标题】:Check whether list of custom objects have same value for a property in Java 8检查自定义对象列表是否与 Java 8 中的属性具有相同的值 【发布时间】:2018-06-10 10:18:19 【问题描述】:

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

 class A 
      int id;
      String name;
 

我想确定该列表中的所有对象是否具有相同的名称。我可以通过遍历列表并捕获名称的先前值和当前值来做到这一点。在这种情况下,我找到了How to count number of custom objects in list which have same value for one of its attribute。但是有没有更好的方法在 java 8 中使用流来做同样的事情?

【问题讨论】:

你的实际输出是什么样的? 实际输出为真/假。 或使用grouppingBy 然后检查大小。 list.stream() .collect(Collectors.groupingBy(A::getName, Collectors.toList())) 【参考方案1】:

使用分区的更多选项。分区是一种特殊的分组,其中生成的映射最多包含两个不同的组——一个代表真,一个代表假。

通过这个,你可以得到匹配和不匹配的数量

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 
        

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

另一种方法是使用

计算不同名称的计数
boolean result = myList.stream().map(A::getName).distinct().count() == 1;

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

使用流的最有效 + 清晰的解决方案,IMO。 allMatch 一发现不匹配的元素就会短路。 如果name可以为空,则添加if语句检查firstName不为空并更改为allMatch(x -&gt; firstName.equals(x.name));。如果firstName 为空,仍然必须检查所有其他名称是否为空。 Aomine 的解决方案似乎涵盖了这些情况。

以上是关于检查自定义对象列表是不是与 Java 8 中的属性具有相同的值的主要内容,如果未能解决你的问题,请参考以下文章

检查自定义类列表中是不是存在变量[重复]

检查 iOS 8 的自定义键盘中的输入文本是不是为空

Android - 通过复选框使用自定义适配器从列表视图中获取项目

基于请求的不同属性和基于java中的请求的不同顺序排序(不是重复的)

具有任何匹配属性的对象的 JAVA 8 过滤器列表

检查列表是不是包含飞镖中对象的属性