Java 8 convertir Mapa <K, List <V >> al mapa <V, List <K >>

Terraza Velykyy:

Necesito convertir Map<K, List<V>>a Map<V, List<K>>. He estado luchando con este problema desde hace algún tiempo.

Es obvio cómo hacer la conversión Map<K, V>a Map<V, List<K>>:

.collect(Collectors.groupingBy(
     Map.Entry::getKey, 
     Collectors.mapping(Map.Entry::getValue, toList())
)

Pero no puedo encontrar resolver un problema inicial. ¿Hay alguna forma fácil de prêt-java-8 para hacerlo?

Eugene:

Creo que estaban cerca, que tendría que flatMapesas entradas a una Streamy retirar de allí. He utilizado el ya presente SimpleEntry, pero se puede utilizar una Pairde algún tipo también.

initialMap.entrySet()
          .stream()
          .flatMap(entry -> entry.getValue().stream().map(v -> new SimpleEntry<>(entry.getKey(), v)))
          .collect(Collectors.groupingBy(
               Entry::getValue,
               Collectors.mapping(Entry::getKey, Collectors.toList())
         ));

Bueno, si usted no desea crear la sobrecarga adicional de esos SimpleEntrycasos, usted podría hacerlo un poco diferente:

    Map<Integer, List<String>> result = new HashMap<>();

    initialMap.forEach((key, values) -> {
        values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
    });

Supongo que te gusta

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