如何用Stream groupingBy实现Map按关联Group属性分组转换?
用Stream groupingBy实现按Group分组的Map转换
要实现需求,首先需要给Id类添加一个group属性的getter方法(原代码中group为私有且无访问方法,无法直接获取):
private static class Id { private Group group; public Id(Group group) { this.group = group; } // 新增getter以访问group属性 public Group getGroup() { return group; } }
接下来就可以通过Stream的groupingBy收集器完成分组转换,核心逻辑是遍历ids的键值对,依据idDefinitions中的关联关系按Group分组,同时将对应键值对收集到子Map中:
基础实现(假设ids的所有键都在idDefinitions中存在)
Map<Group, Map<String, Object>> idsByGroup = ids.entrySet().stream() .collect(Collectors.groupingBy( // 分组依据:从idDefinitions中获取当前键对应的Group entry -> idDefinitions.get(entry.getKey()).getGroup(), // 下游收集器:将分组内的键值对收集为子Map Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue) ));
带过滤的实现(处理ids中存在idDefinitions没有的键的情况)
如果不确定ids的所有键都在idDefinitions中有对应记录,可以添加filter步骤避免空指针异常:
Map<Group, Map<String, Object>> idsByGroup = ids.entrySet().stream() .filter(entry -> idDefinitions.containsKey(entry.getKey())) .collect(Collectors.groupingBy( entry -> idDefinitions.get(entry.getKey()).getGroup(), Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue) ));
代码逻辑说明
- 将
ids的键值对集合(entrySet)转换为Stream进行流式处理 - (可选)过滤掉
idDefinitions中无对应记录的键,避免后续获取Id对象时出现NullPointerException - 使用
groupingBy收集器:- 第一个参数是分类函数,用于确定每个元素属于哪个分组(这里是通过当前键从
idDefinitions中获取Group) - 第二个参数是下游收集器,用于将每个分组内的元素收集为目标结构(这里用
toMap将键值对转为子Map)
- 第一个参数是分类函数,用于确定每个元素属于哪个分组(这里是通过当前键从
内容的提问来源于stack exchange,提问作者SCM
相关产品推荐
相关产品推荐

