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

Ashishkumar Singh:

Perdóname si la solución es muy obvio, pero me parece que no puede encontrar la manera de hacer esto

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);
}

Quiero grupo por sobre la base de valores en HashMap. Quiero que la salida sea {a1=[b1, b3], a2=[b2]}pero actualmente viene como{a1=[a1, a1], a2=[a2]}

Ousmane D .:

Actualmente, estás streaming a través de los valores de mapa (que supongo que es un error tipográfico), basado en su salida necesaria que debe transmitir sobre el mapa entrySety el uso groupingBybasado en el valor del mapa de y mappingcomo un colector aguas abajo sobre la base de la clave del mapa de:

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

También podría realizar esta lógica sin una corriente a través de forEach+ computeIfAbsent:

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=136577&siteId=1
Recomendado
Clasificación