Comment mapper des valeurs dans une carte en Java 8? [dupliquer]


Cette question a déjà une réponse ici:

Dites que j'ai un Map<String, Integer>. Existe-t-il un moyen facile d'en obtenir un Map<String, String>?

Par facile, je veux dire pas comme ça:

Map<String, String> mapped = new HashMap<>();
for(String key : originalMap.keySet()) {
    mapped.put(key, originalMap.get(key).toString());
}

, Mais plutôt une doublure comme:

Map<String, String> mapped = originalMap.mapValues(v -> v.toString());

, Mais évidemment il n'y a pas de méthode mapValues.

Author: skiwi, 2014-04-22

2 answers

Vous devez diffuser les entrées et les collecter dans une nouvelle carte:

Map<String, String> result = map.entrySet().stream()
                  .collect(toMap(Entry::getKey, e -> String.valueOf(e.getValue()));
 78
Author: assylias, 2014-04-22 08:48:46

La façon La plus simple de le faire est:

Map<String, Integer> map = new HashMap<>();
Map<String, String> mapped = map.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, entry -> String.valueOf(entry.getValue())));

Ce que vous faites ici, c'est: -

  1. Obtenir un Stream<Map.Entry<String, Integer>>
  2. Recueillir les résultats dans la carte résultante:
    1. Mapper les entrées à leur clé.
    2. Mapper les entrées aux nouvelles valeurs, en incorporant String.valueOf.

La raison pour laquelle vous ne pouvez pas le faire dans un one-liner, c'est parce que l'interface Map ne l'offre pas, le plus proche que vous pouvez obtenir est map.replaceAll, mais cette méthode dicte que le type doit rester la même.

 18
Author: skiwi, 2014-04-22 08:27:51