Java流-使用groupingBy和计数收集到映射,但是如果特定字段为空,则计数为0

问题描述 投票:2回答:2

我有一个带有这样的类的对象列表:

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

我想将此列表收集到地图中,按性别分组,并计算它们拥有的宠物,如果petName为null,则当然需要传递0。

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

[没有实现Collector接口,这是5种方法(因为我已经在尝试摆脱另一个自定义收集器)如果petName字段为null,如何使该计数不计入对象?

java lambda java-8 functional-programming java-stream
2个回答
3
投票

[首先,按性别将所有人员分组,然后使用过滤器收集器过滤出具有空名称的人员。最后,使用下游计数收集器来计数属于每个类别的元素的数量。这是它的外观。

Map<String, Long> personCntByGender = people.stream()
    .collect(Collectors.groupingBy(Person::getGender, 
        Collectors.filtering(p -> p.getPetName() != null, 
            Collectors.counting())));

0
投票

关于上面的评论(在性别没有宠物的情况下,关于需要0,我相信以下内容可以满足您的要求:

people.stream()
            .collect(Collectors.toMap(Person::getGender,
                    person -> person.getPetName() == null ? 0L : 1L,
                    Long::sum));
© www.soinside.com 2019 - 2024. All rights reserved.