Java Streams-使用GroupingBy和Counting收集到映射,但如果特定字段为空,则计数为0
为了防止问题被“重复猎人”发现,我需要指出,我并不认为我正在寻找的解决方案是过滤。我做了我的搜索,从来没有遇到一个答案提到过滤 我有一个对象列表,其类如下:Java Streams-使用GroupingBy和Counting收集到映射,但如果特定字段为空,则计数为0,java,lambda,functional-programming,java-stream,java-11,Java,Lambda,Functional Programming,Java Stream,Java 11,为了防止问题被“重复猎人”发现,我需要指出,我并不认为我正在寻找的解决方案是过滤。我做了我的搜索,从来没有遇到一个答案提到过滤 我有一个对象列表,其类如下: class Person { String gender; String income; String petName; } 我想把这个列表收集到一张地图上,按性别分组,统计他们养的宠物,当然,如果petName为空,则需要传递0 Map<String, Long> mapping = people .stre
class Person {
String gender;
String income;
String petName;
}
我想把这个列表收集到一张地图上,按性别分组,统计他们养的宠物,当然,如果petName为空,则需要传递0
Map<String, Long> mapping = people
.stream()
.collect(Collectors.groupingBy(Person::gender, Collectors.counting());
Map-mapping=人
.stream()
.collect(Collectors.groupingBy(Person::gender,Collectors.counting());
如果没有实现收集器接口和它的5个方法(因为我已经尝试摆脱另一个自定义收集器),如果对象的petName
字段为null
,我如何使它不计算对象的数量
我可以从Java-11中获益,首先,按性别对所有人进行分组,然后使用筛选收集器筛选出姓名为空的人。最后,使用计数下游收集器计算属于每个类别的元素数。下面是它的外观
Map<String, Long> peopleCntByGender = people.stream()
.collect(Collectors.groupingBy(Person::getGender,
Collectors.filtering(p -> p.getPetName() != null,
Collectors.counting())));
Map peopleCntByGender=people.stream()
.collect(收集器).groupingBy(个人::getGender,
Collectors.filtering(p->p.getPetName()!=null,
收集器。计数();
不过,过滤收集器只能在Java9中使用,因此如果您使用Java8而不能很容易地迁移到Java9,请考虑编写自己的自定义<代码>过滤< /代码>收集器并在此处使用。JDK 9源代码可能有帮助。(关于性别没有宠物的情况下需要
0
)我相信以下内容涵盖了您的要求:
people.stream()
.collect(Collectors.toMap(Person::getGender,
person -> person.getPetName() == null ? 0L : 1L,
Long::sum));
只需一个调用,
收集器。过滤
与Java-9及以上版本一起工作。有趣的是,我确实使用Java9,因此在这种情况下,OP需要为Java8编写一个。对于Java-8的实现,请参阅我们使用的是Java-11,没有问题。与其建议新的依赖关系或升级,不如为Java-8提供一个解决方案在看到答案之前,我从未想过对我的收藏应用一些过滤。我已经进行了搜索。不要将所有内容都标记为重复以获取分数。。。