I have a nested map Map<String, Map<String, List<ObjectA>>>
passed to me, and I want to change it to type Map<String, Map<String, Set<ObjectA>>>
, what is the easiest way to do so in Java using stream? I have tried to use Collectors.groupingBy but can't get it working.
Asked
Active
Viewed 345 times
4

Victoria Maritt
- 43
- 3
1 Answers
4
The best way is you have to iterate through each entry in outer map and inner map, and then convert the inner map entry value List<ObjectA>
to Set<ObjectA>
Map<String, Map<String, Set<ObjectA>>> resultMap = map.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, val -> new HashSet<>(val.getValue())))));
Note : If you are converting List
to HashSet
then you will not maintain same order, so you can choose LinkedHashSet
over HashSet
to maintain order
Map<String, Map<String, Set<ObjectA>>> resultMap = map.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, val -> new LinkedHashSet<>(val.getValue())))));

Ryuzaki L
- 37,302
- 12
- 68
- 98