2014-04-22 7 views
25

Sag ich habe eine Map<String, Integer>. Gibt es einen einfachen Weg, um eine Map<String, String> davon zu bekommen?Wie werden Werte in einer Map in Java 8 abgebildet?

Durch einfach, ich meine das nicht mag:

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

aber eher etwas Einzeiler wie:

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

Aber offensichtlich gibt es keine Methode mapValues.

+0

Ja, es ist ein Duplikat. Es tut uns leid. – siledh

Antwort

53

Sie müssen die Einträge streamen und sie in einer neuen Karte sammeln:

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

Ich mag das viel besser, und es ist sogar eine Zeile (technisch). +1 – Rogue

14

Der einfachste Weg, dies zu tun ist:

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

Was Sie hier tun, ist:

  1. Erhalten Sie eine Stream<Map.Entry<String, Integer>>
  2. Sammeln Sie die Ergebnisse in der resultierenden Karte:
    1. Ordnen Sie die Einträge ihrem Schlüssel zu.
    2. Ordnen Sie die Einträge den neuen Werten zu, einschließlich String.valueOf.

Der Grund, warum Sie es nicht in einem Einzeiler tun kann, ist, weil die Map Schnittstelle nicht so bietet, die nächstgelegene Sie dazu kommen kann, ist map.replaceAll, aber das Verfahren schreibt vor, dass die Art bleiben sollte das Gleiche.