如何用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
相关产品推荐
相关产品推荐

