How to map values in a map in Java 8?
JavaMapLambdaJava 8Java 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:
- Obtain a
Stream<Map.Entry<String, Integer>>
- Collect the results in the resulting map:
- Map the entries to their key.
- 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.