You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:48:21