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

Java Stream用groupingBy分组已过滤null键仍报错如何解决

根因说明

你已经添加了空值过滤逻辑仍然报错,通常是以下两种原因导致:

  • 两次调用属性getter的结果不一致:filter阶段调用getPartyDisclosureTypeCode()返回非空值,到collect分组阶段再次调用该方法时返回了null,常见于属性被并发修改、getter方法包含动态生成逻辑的场景
  • 并行流下的操作时序问题:并行流的过滤和分组操作不存在原子性保障,元素属性在两个步骤的间隙被修改为null
修复方案
  1. 调整流操作逻辑,仅提取一次分组key,避免两次调用getter带来的结果不一致:
Map<String, List<PartyInfo>> accountPartyInfoMap1 = partyInfoData.stream()
        // 提前提取分组key和元素的映射,确保后续过滤、分组使用的是同一个key值
        .map(party -> new AbstractMap.SimpleEntry<>(party.getPartyDisclosureTypeCode(), party))
        .filter(entry -> Objects.nonNull(entry.getKey()))
        .collect(Collectors.groupingBy(
                Map.Entry::getKey,
                Collectors.mapping(Map.Entry::getValue, Collectors.toList())
        ));
  1. 若你使用的是并行流,可以先切换为串行流验证问题是否消失。确认是并发修改导致的问题后,可以给PartyInfo类的partyDisclosureTypeCode属性添加final修饰保证不可变,或者在流操作期间锁定该属性不允许其他线程修改。
  2. 如果你允许将null key的元素单独归为一组,可以直接在key提取时统一处理null值,不需要额外过滤:
Map<String, List<PartyInfo>> accountPartyInfoMap1 = partyInfoData.stream()
        .collect(Collectors.groupingBy(
                party -> Optional.ofNullable(party.getPartyDisclosureTypeCode()).orElse("NULL_KEY")
        ));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:15:03