使用Java Streams将Map<Integer,Integer>反转为键对应整数列表的Map
问题原因
你的代码逻辑错误出在流数据源选择上:你使用m.values()生成流,流内元素全部是原Map的value值,分组时只会把这些重复的value本身收集到列表中,完全没有关联原Map的key,因此才会出现列表元素全是分组键本身的错误结果。
正确Streams实现
要实现「按原Map的value分组,收集对应所有key为列表」的反转需求,需要遍历原Map的entrySet获取完整键值对,以entry的value为分组键,收集entry的key为列表元素,完整实现代码如下:
public static void main(String[] args) { Map<Integer, Integer> m = new HashMap<>(); m.put(1, 1); m.put(2, 1); m.put(3, 1); m.put(4, 2); m.put(5, 2); m.put(6, 2); m.put(7, 2); Map<Integer, List<Integer>> personByAge = m.entrySet() .stream() .collect(Collectors.groupingBy( Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList()) )); personByAge.forEach((groupKey, keyList) -> { System.out.println(groupKey + " <- key"); keyList.forEach(k -> System.out.println("Values: " + k)); }); }
关键逻辑说明
- 流数据源替换为
m.entrySet():保证流中每个元素都携带原Map的单组key、value映射关系 - 分组规则使用
Map.Entry::getValue:和需求一致,以原Map的value作为新Map的key - 下游收集器使用
Collectors.mapping(Map.Entry::getKey, Collectors.toList()):先将分组后的每个entry映射为对应的原key,再将所有key收集为整数列表
运行上述代码即可得到预期输出:
1 <- key Values: 1 Values: 2 Values: 3 2 <- key Values: 4 Values: 5 Values: 6 Values: 7
内容的提问来源于stack exchange,提问作者coco
相关产品推荐
相关产品推荐

