Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Streams-使用GroupingBy和Counting收集到映射,但如果特定字段为空,则计数为0_Java_Lambda_Functional Programming_Java Stream_Java 11 - Fatal编程技术网

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提供一个解决方案在看到答案之前,我从未想过对我的收藏应用一些过滤。我已经进行了搜索。不要将所有内容都标记为重复以获取分数。。。