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

如何用Java 8 GroupBy根据MapEntry值获取键的分组

问题描述

原始Map数据:

A -> Added
B -> Removed
C -> Modified
D -> Added
E -> Added

期望输出格式:

Added    = [A, D, E]
Removed  = [B]
Modified = [C]

尝试代码未得到预期结果:

map.entrySet().stream().collect(Collectors.groupingBy(entry-> entry.getValue()));
解决方案

你当前的groupingBy仅完成了按值分组,但分组后得到的是Map<String, List<Map.Entry<String, String>>>——每个分组里存的是完整的键值对Entry,而非我们需要的键(A、B这类标识)。

要实现预期效果,需要在groupingBy中搭配Collectors.mapping转换分组内的元素,提取出键:

Map<String, List<String>> result = map.entrySet().stream()
    .collect(Collectors.groupingBy(
        Map.Entry::getValue,  // 按Value作为分组键
        Collectors.mapping(Map.Entry::getKey, Collectors.toList())  // 将每个Entry转为对应的Key并收集为List
    ));

这段代码会生成结构符合需求的Map:

  • Added 对应 [A, D, E]
  • Removed 对应 [B]
  • Modified 对应 [C]

如果要输出成你期望的格式化字符串,可遍历结果Map做对齐处理:

result.forEach((status, keys) -> {
    // 给状态名补空格,保证输出对齐
    String formattedStatus = String.format("%-8s", status);
    System.out.println(formattedStatus + " = " + keys);
});

内容的提问来源于stack exchange,提问作者Yogesh Ukale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:27:32