我刚接触Java8。我有一个类型a的自定义对象列表,其中a如下所示:
class A { int id; String name; }
我想确定该列表中的所有对象是否具有相同的名称。我可以通过遍历列表并捕获名称的前一个和当前值来实现。在这种情况下,我发现了如何计算列表中的自定义对象的数量,这些对象的一个属性具有相同的值。但是在Java8中,有没有更好的方法使用流来实现同样的功能呢?
ercv8c1e1#
一种方法是获取第一个列表的名称并调用 allMatch 检查一下。
allMatch
String firstName = yourListOfAs.get(0).name; boolean allSameName = yourListOfAs.stream().allMatch(x -> x.name.equals(firstName));
lnxxn5zx2#
你可以 map 从 A --> String ,应用 distinct 中间操作,利用 limit(2) 在可能的情况下启用优化,然后检查 count 小于或等于 1 在这种情况下,所有对象都有相同的名称,如果没有,则它们不都有相同的名称。
map
A
String
distinct
limit(2)
count
1
boolean result = myList.stream() .map(A::getName) .distinct() .limit(2) .count() <= 1;
在上面的示例中,我们利用 limit(2) 操作,以便我们在找到两个不同的对象名时立即停止。
r7s23pms3#
另一种方法是使用
boolean result = myList.stream().map(A::getName).distinct().count() == 1;
当然,您需要为“name”字段添加getter
cig3rfwq4#
另一个选择是使用分区。分区是一种特殊的分组,在这种分组中,生成的Map最多包含两个不同的组—一个为真,一个为假。通过这个,你可以得到匹配和不匹配的数目
String firstName = yourListOfAs.get(0).name; Map<Boolean, List<Employee>> partitioned = employees.stream().collect(partitioningBy(e -> e.name==firstName));
使用takewhile takewhile的java9将获取所有值,直到 predicate 返回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 }
wgxvkvu95#
或使用 groupingBy 然后检查 entrySet 大小。
groupingBy
entrySet
boolean b = list.stream() .collect(Collectors.groupingBy(A::getName, Collectors.toList())).entrySet().size() == 1;
5条答案
按热度按时间ercv8c1e1#
一种方法是获取第一个列表的名称并调用
allMatch
检查一下。lnxxn5zx2#
你可以
map
从A
-->String
,应用distinct
中间操作,利用limit(2)
在可能的情况下启用优化,然后检查count
小于或等于1
在这种情况下,所有对象都有相同的名称,如果没有,则它们不都有相同的名称。在上面的示例中,我们利用
limit(2)
操作,以便我们在找到两个不同的对象名时立即停止。r7s23pms3#
另一种方法是使用
当然,您需要为“name”字段添加getter
cig3rfwq4#
另一个选择是使用分区。分区是一种特殊的分组,在这种分组中,生成的Map最多包含两个不同的组—一个为真,一个为假。
通过这个,你可以得到匹配和不匹配的数目
使用takewhile takewhile的java9将获取所有值,直到 predicate 返回false。这类似于while循环中的break语句
wgxvkvu95#
或使用
groupingBy
然后检查entrySet
大小。