You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 11中用groupingBy统计非空petName(无需自定义Collector)

解决方案:利用JDK自带收集器组合实现分组内非空统计(无需自定义Collector)

首先明确,咱们避开全局过滤的方式(你提到已搜索过滤类方案并排除),转而用Java 9+(Java 11完全支持)引入的Collectors.filtering作为groupingBy的下游收集器,完美满足你的需求,而且完全不用手动实现Collector的五个方法。

直接上代码:

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

为什么这不是过滤类方案?

和先全局过滤petName非空元素再分组的方式不同,这个方案是先完成所有gender的分组,再在每个组内过滤统计符合条件的元素。这样的好处是:即使某个gender对应的所有Person的petName都为空,这个gender依然会作为key保留在结果Map中,对应的值为0;而全局过滤的话,这个gender会直接从结果中消失,这应该就是你想要的非过滤类实现逻辑。

细节调整

  • 如果你的需求中petName为空字符串("")也算“非空”,只需要排除null的话,可以把过滤条件简化为person.getPetName() != null;
  • String.isBlank()是Java 11新增的方法,能同时判断空字符串和全空白字符(比如空格、制表符),非常适合用来判断“实际为空”的文本。

这个方案完全依赖JDK原生收集器的组合,不需要任何自定义Collector的代码,完全符合你的要求。

内容的提问来源于stack exchange,提问作者Melih

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:58