Collectors.groupby for Map <String,List <String>

Ash*_*ngh 9 java java-8 java-stream collectors

请原谅我,如果解决方案非常明显,但我似乎无法弄清楚如何做到这一点

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("b1", "a1");
    map.put("b2", "a2");
    map.put("b3", "a1");
    Map<String, List<String>> mm = map.values().stream().collect(Collectors.groupingBy(m -> m));
    System.out.println(mm);
}
Run Code Online (Sandbox Code Playgroud)

我想根据hashmap中的值进行分组.我想要输出,{a1=[b1, b3], a2=[b2]}但它现在正在出现{a1=[a1, a1], a2=[a2]}

Ous*_* D. 6

目前,您正在流式传输地图值(我假设是一个拼写错误),根据您所需的输出,您应该在地图上流式传输并根据地图值entrySet使用groupingBy,并mapping根据地图键使用下游收集器:

 Map<String, List<String>> result = map.entrySet()
            .stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue,
                          Collectors.mapping(Map.Entry::getKey, 
                                        Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

您也可以在没有流forEach+ +的情况下执行此逻辑computeIfAbsent:

Map<String, List<String>> result = new HashMap<>();
map.forEach((k, v) -> result.computeIfAbsent(v, x -> new ArrayList<>()).add(k));
Run Code Online (Sandbox Code Playgroud)