1

I have a List<Map<String, String>>. I would like to convert it into single map.

The list size can be 1..n. Not sure how to do that using Java 8 Stream?

List<Map<String, String>> mapList = new ArrayList<>();

Map<String, String> map1 = new HashMap<>();
map1.put("1", "One");
map1.put("2", "Two");

Map<String, String> map2 = new HashMap<>();
map2.put("3", "Three");
map2.put("4", "Four");

mapList.add(map1);
mapList.add(map2);

Map<String, String> finalMap = new HashMap<>();

We could do something like this in Java 7:

for(Map<String, String> map : mapList) {            
    for(String key : map.keySet()) {                
        finalMap.put(key, map.get(key));
    }           
}

System.out.println("Final Map " + finalMap); // Final Map {1=One, 2=Two, 3=Three, 4=Four}
Naman
  • 27,789
  • 26
  • 218
  • 353
Shan
  • 57
  • 1
  • 6

2 Answers2

8

You can flatMap it and then use Collectors.toMap:

mapList.stream()
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Note, that duplicate keys are not handled. To ignore duplicates, you can use:

Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1)
Andronicus
  • 25,419
  • 17
  • 47
  • 88
0

Here is one way to do it. I choose a method that handles duplicates by putting them in a list of strings. I added duplicate of each map in the other to demonstrate.

        List<Map<String, String>> mapList = new ArrayList<>();

        Map<String, String> map1 = new HashMap<>();
        map1.put("1", "One");
        map1.put("2", "Two");
        map1.put("4", "Four");
        Map<String, String> map2 = new HashMap<>();
        map2.put("3", "Three");
        map2.put("1", "One");
        map2.put("4", "Four");


        mapList.add(map1);
        mapList.add(map2);

        Map<String,List<String>> combined = mapList.stream()
                .flatMap(m -> m.entrySet().stream())
                .collect(Collectors.groupingBy(Entry::getKey,
                        Collectors.mapping(Entry::getValue,
                                Collectors.toList())));

        combined.entrySet().forEach(System.out::println);

Prints

1=[One, One]
2=[Two]
3=[Three]
4=[Four, Four]

WJS
  • 36,363
  • 4
  • 24
  • 39