Java Streams如何按Map键的属性分组生成嵌套Map结构
实现方案
假设你已经为类A的b属性提供了符合Java Bean规范的getter方法getB(),可以直接用如下Stream操作完成分组:
import java.util.Map; import java.util.stream.Collectors; // 原有输入集合 Map<A, List<C>> originalMap = ...; // 分组后的结果 Map<B, Map<A, List<C>>> result = originalMap.entrySet() .stream() .collect(Collectors.groupingBy( // 外层分组key:取entry的键A的属性b entry -> entry.getKey().getB(), // 下游收集器:把同个B对应的所有entry重新收集为Map<A, List<C>> Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue) ));
特殊场景适配
- 如果存在多个
A实例的b属性相同、且A实例本身也重复的情况,需要给toMap方法补充冲突处理逻辑,避免抛出键重复异常:Map<B, Map<A, List<C>>> result = originalMap.entrySet() .stream() .collect(Collectors.groupingBy( entry -> entry.getKey().getB(), Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, // 键重复时保留先出现的value,可根据业务需求调整 (oldVal, newVal) -> oldVal ) )); - 如果类
A没有提供b的getter、且你可以直接访问属性b(比如属性是public的,或者和操作代码在同一个包下的包访问权限),可以直接把分组的key提取逻辑改成entry -> entry.getKey().b即可。
内容的提问来源于stack exchange,提问作者Vadym Mjakishew
相关产品推荐
相关产品推荐

