web-dev-qa-db-fra.com

Comment mapper des valeurs dans une carte dans Java 8?

Disons que j'ai un Map<String, Integer>. Existe-t-il un moyen facile d’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 un liner comme:

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

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

46
siledh

Vous devez diffuser en flux les entrées et les rassembler dans une nouvelle carte:

Map<String, String> result = map.entrySet().stream()
                  .collect(Collectors.toMap(Entry::getKey, e -> String.valueOf(e.getValue()));
100
assylias

Le moyen le 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. Rassemblez les résultats dans la carte obtenue:
    1. Mappez les entrées sur leur clé.
    2. Mappez les entrées sur les nouvelles valeurs en incorporant String.valueOf.

La raison pour laquelle vous ne pouvez pas le faire dans une ligne, c'est parce que l'interface Map ne propose pas une telle solution, le plus proche que vous pouvez obtenir c'est map.replaceAll, mais cette méthode dicte que le type reste inchangé.

22
skiwi