gpt4 book ai didi

Java Streams - 使用 GroupingBy 收集到映射并进行计数,但如果特定字段为空则计数 0

转载 作者:行者123 更新时间:2023-12-03 01:02:14 28 4
gpt4 key购买 nike

为了保护这个问题免受“重复猎人”的影响,我需要提到的是,我不认为我正在寻找的解决方案是过滤。我进行了搜索,从未遇到提及过滤的答案。

我有一个具有类似类的对象列表:

class Person {
String gender;
String income;
String petName;
}

我想把这个List收集成一个 map ,按性别分组,统计他们拥有的宠物,当然如果petName为null需要传0。

Map<String, Long> mapping = people
.stream()
.collect(Collectors.groupingBy(Person::gender, Collectors.counting());

如果不实现 Collector 接口(interface),它有 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,请考虑编写自己的自定义过滤收集器并在此处使用它。这个answer或者 JDK 9 源代码可能会有所帮助。

关于Java Streams - 使用 GroupingBy 收集到映射并进行计数,但如果特定字段为空则计数 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58302233/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com