How to map values in a map in Java 8?

JavaMapLambdaJava 8

Java Problem Overview


Say I have a Map<String, Integer>. Is there an easy way to get a Map<String, String> from it?

By easy, I mean not like this:

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

But rather some one liner like:

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

But obviously there is no method mapValues.

Java Solutions


Solution 1 - Java

You need to stream the entries and collect them in a new map:

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

Solution 2 - Java

The easiest way to do so is:

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

What you do here, is:

  1. Obtain a Stream<Map.Entry<String, Integer>>
  2. Collect the results in the resulting map:
  3. Map the entries to their key.
  4. Map the entries to the new values, incorporating String.valueOf.

The reason you cannot do it in a one-liner, is because the Map interface does not offer such, the closest you can get to that is map.replaceAll, but that method dictates that the type should remain the same.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsiledhView Question on Stackoverflow
Solution 1 - JavaassyliasView Answer on Stackoverflow
Solution 2 - JavaskiwiView Answer on Stackoverflow