在Java 8

时间:2017-12-30 06:41:40

标签: java arraylist java-8 java-stream

我是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中做同样的事情?

5 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:0)

另一种方法是使用

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

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

答案 3 :(得分:0)

或者使用groupingBy,然后检查entrySet尺寸。

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

答案 4 :(得分:0)

使用分区的另一个选项。分区是一种特殊的分组,其中结果映射最多包含两个不同的组 - 一个用于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。这类似于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 
        }