java - Java Streams - 使用 GroupingBy 和计数收集到地图,但如果特定字段为 Null,则计数为 0
问题描述
为了防止“重复猎人”的问题,我需要提一下,我认为我正在寻找的解决方案不是过滤。我进行了搜索,从未遇到提到过滤的答案。
我有一个像这样的类的对象列表:
class Person {
String gender;
String income;
String petName;
}
我想将此列表收集到一个地图中,按性别分组,并计算他们拥有的宠物,如果petName为空,当然需要传递0。
Map<String, Long> mapping = people
.stream()
.collect(Collectors.groupingBy(Person::gender, Collectors.counting());
没有实现 Collector 接口和它的 5 种方法(因为我已经在尝试摆脱另一个自定义收集器)如果它的petName
字段是,我怎样才能使它不计算对象null
。
我可以从 Java-11 中受益
解决方案
首先,将所有人按性别分组,然后使用过滤收集器过滤掉姓名为空的人。最后,使用计数下游收集器来统计属于每个类别的元素个数。这是它的外观。
Map<String, Long> peopleCntByGender = people.stream()
.collect(Collectors.groupingBy(Person::getGender,
Collectors.filtering(p -> p.getPetName() != null,
Collectors.counting())));
但是,过滤收集器仅在 Java9 中可用,因此如果您使用的是 Java8 并且无法轻松迁移到 Java9,请考虑编写自己的自定义filtering
收集器并在此处使用它。这个答案或 JDK 9 源代码可能会有所帮助。
推荐阅读
- reactjs - 如何在 reactjs 16.8 中获取 refetchQueries 数据
- javascript - 如何从 axios promise 对象中获取数据?
- c++ - 操作数 Matrix2D 和 Matrix2D 没有匹配的运算符(但我已经定义了它们)
- android - 使用相机捕获图像并将该图像作为电子邮件附件发送:Android Studio
- spring-boot - Spring Boot 中 logback 中自定义评估程序中的依赖注入
- postgresql - 如何将 ON CONFLICT 与外部表上的主键一起使用
- javascript - 通过单击导航栏实现将鼠标悬停到垂直下拉列表的水平下拉列表
- c# - WEB API OdataController POST 调用返回 406 Not Acceptable
- arrays - 有没有办法在 Excel-VBA 中显示或查看分配的内存或数组的使用情况?
- html - 引导响应中的不同表列和行