我是Java 8的新手。我有一个由类型为A的自定义对象组成的列表,其中A的结构如下:
class A {
int id;
String name;
}
我想确定列表中的所有对象是否具有相同的名称。我可以通过迭代列表并捕获名称的前一个和当前值来实现。在这种情况下,我发现如何计算列表中具有某个属性相同值的自定义对象的数量。但是,在Java 8中是否有更好的方法使用流来执行相同的操作?
我是Java 8的新手。我有一个由类型为A的自定义对象组成的列表,其中A的结构如下:
class A {
int id;
String name;
}
我想确定列表中的所有对象是否具有相同的名称。我可以通过迭代列表并捕获名称的前一个和当前值来实现。在这种情况下,我发现如何计算列表中具有某个属性相同值的自定义对象的数量。但是,在Java 8中是否有更好的方法使用流来执行相同的操作?
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));
allMatch
会在找到一个不匹配的元素后立即终止。 - Stephen CfirstName
不为空,并将其更改为allMatch(x -> firstName.equals(x.name));
。如果firstName
仍然为空,则还必须检查所有其他名称是否为空。看起来Aomine的解决方案已经涵盖了这些情况。 - James另一种方法是使用计算不同名称的数量
boolean result = myList.stream().map(A::getName).distinct().count() == 1;
当然,您需要为“name”字段添加getter方法。
使用分区是另一种选择。分区是一种特殊的分组方式,其结果映射最多包含两个不同的组 - 一个为真,一个为假。
通过这种方式,您可以得到匹配和不匹配的数量。
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;
grouppingBy
然后检查大小。list.stream() .collect(Collectors.groupingBy(A::getName, Collectors.toList()))
- Hadi J