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