2014-04-22 28 views
25

Powiedz, że mam Map<String, Integer>. Czy istnieje łatwy sposób, aby uzyskać od niego Map<String, String>?Jak mapować wartości na mapie w Java 8?

Poprzez proste, to znaczy nie podoba:

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

ale raczej ktoś liner jak:

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

Ale oczywiście nie ma metody mapValues.

+0

Tak, jest to duplikat. Przepraszam. – siledh

Odpowiedz

53

trzeba przesyłać wpisy i zebrać je w nowej mapy:

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

Podoba mi się to znacznie lepiej, a to nawet jedna linia (technicznie). +1 – Rogue

14

Najprostszym sposobem na to jest:

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

Co robisz tutaj, jest:

  1. Uzyskaj Stream<Map.Entry<String, Integer>>
  2. Zbierz wyniki na wynikowej mapie:
    1. Mapuj wpisy na ich klucze.
    2. Mapuj wpisy na nowe wartości, uwzględniając String.valueOf.

Powodem nie można zrobić w jednej wkładki, dlatego interfejs Map nie oferuje takich, najbliżej można dostać się, że jest map.replaceAll, ale ta metoda mówi, że typ powinien pozostać to samo.

Powiązane problemy