Java Stream用groupingBy分组已过滤null键仍报错如何解决
根因说明
你已经添加了空值过滤逻辑仍然报错,通常是以下两种原因导致:
- 两次调用属性getter的结果不一致:filter阶段调用
getPartyDisclosureTypeCode()返回非空值,到collect分组阶段再次调用该方法时返回了null,常见于属性被并发修改、getter方法包含动态生成逻辑的场景 - 并行流下的操作时序问题:并行流的过滤和分组操作不存在原子性保障,元素属性在两个步骤的间隙被修改为null
修复方案
- 调整流操作逻辑,仅提取一次分组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()) ));
- 若你使用的是并行流,可以先切换为串行流验证问题是否消失。确认是并发修改导致的问题后,可以给
PartyInfo类的partyDisclosureTypeCode属性添加final修饰保证不可变,或者在流操作期间锁定该属性不允许其他线程修改。 - 如果你允许将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
相关产品推荐
相关产品推荐

