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
相关产品推荐
相关产品推荐

