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

Java8 Stream groupingBy按嵌套processTypeId分组实现方案

实体关系说明

涉及两层嵌套实体结构:

  • ContractTerms实体
private BigDecimal id;
private ProgramDetails programDetails;
  • ProgramDetails实体
private BigDecimal id;
private ProcessType processTypeId;

原有实现仅支持按ProgramDetails对象整体分组,代码如下:

termValueForExtention.stream().collect(groupingBy(ContractTerms::getProgramDetails));
实现方案

直接调整groupingBy的分类键提取逻辑,读取嵌套层级的processTypeId作为分组依据即可,修正后代码:

import java.util.stream.Collectors;

Map<ProcessType, List<ContractTerms>> groupResult = termValueForExtention.stream()
    .collect(Collectors.groupingBy(term -> term.getProgramDetails().getProcessTypeId()));

注意:原代码中grouppingBy为拼写错误,正确方法名为groupingBy,需从java.util.stream.Collectors导入后使用。

空值兼容处理

如果业务数据中存在ContractTerms.programDetails为null的场景,上述写法会触发空指针,可增加空判断逻辑,将空属性数据统一归组:

Map<ProcessType, List<ContractTerms>> groupResult = termValueForExtention.stream()
    .collect(Collectors.groupingBy(term -> {
        ProgramDetails details = term.getProgramDetails();
        // 可根据业务需求将null替换为自定义默认分组键
        return details == null ? null : details.getProcessTypeId();
    }));

可选简化写法(需第三方依赖)

如果项目已引入Guava依赖,可通过函数组合实现方法引用式的键提取,代码可读性更高:

import com.google.common.base.Functions;
import java.util.stream.Collectors;
import java.util.function.Function;

Function<ContractTerms, ProcessType> groupKeyExtractor = Functions.compose(
    ProgramDetails::getProcessTypeId,
    ContractTerms::getProgramDetails
);
Map<ProcessType, List<ContractTerms>> groupResult = termValueForExtention.stream()
    .collect(Collectors.groupingBy(groupKeyExtractor));

无特殊需求时优先使用基础lambda写法,无需额外引入依赖,逻辑直观易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:15:38