Java中如何不指定属性值按对象属性对List元素分组生成指定HashMap
实现方案
你可以直接用Java Stream内置的Collectors.groupingBy分组器实现,无需提前指定任何具体的team值,代码如下:
import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; // 核心逻辑 HashMap<String, Map<String, String>> result = items.stream() .collect(Collectors.groupingBy( // 按team属性自动分组,自动提取所有存在的team作为外层Map的key Item::getTeam, // 指定外层生成的集合为HashMap,符合你的要求 HashMap::new, // 每个分组内的Item转换为id为key、name为value的Map Collectors.toMap(Item::getId, Item::getName) ));
注意事项
- 请确保你的
Item类已经补全了getTeam()、getId()、getName()三个getter方法,否则可以把方法引用替换为lambda表达式直接访问属性(不推荐直接访问私有属性):// 无getter时的写法,需要Item的属性为public权限 HashMap<String, Map<String, String>> result = items.stream() .collect(Collectors.groupingBy( item -> item.team, HashMap::new, Collectors.toMap(item -> item.id, item -> item.name) )); - 如果同一个team下存在重复id的Item,上面的代码会抛出冲突异常,你可以追加合并规则处理冲突,比如重复id时保留第一个出现的name:
HashMap<String, Map<String, String>> result = items.stream() .collect(Collectors.groupingBy( Item::getTeam, HashMap::new, Collectors.toMap( Item::getId, Item::getName, // 重复key的合并规则,可根据需求调整为取新值/拼接等逻辑 (oldVal, newVal) -> oldVal ) ));
内容的提问来源于stack exchange,提问作者Lenzman
相关产品推荐
相关产品推荐

