I have a List like this:
List>
Is there a way, using lambda, to convert this list to:
Map>
Example:
Map m1 = new HashMap<>();
m1.put("A", 1);
m1.put("B", 100);
Map m2 = new HashMap<>();
m2.put("A", 10);
m2.put("B", 20);
m2.put("C", 100);
List> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);
After formatting:
Map> afterFormatting;
which would look like:
A -> [1, 10]
B -> [100, 20]
C -> [100]
解决方案
You need to flatMap the entry set of each Map to create a Stream>. Then, this Stream can be collected with the groupingBy(classifier, downstream) collector: the classifier returns the key of the entry and the downstream collector maps the entry to its value and collects that into a List.
Map> map =
list.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
This code needs the following static imports:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
With your full example:
public static void main(String[] args) {
Map m1 = new HashMap<>();
m1.put("A", 1l);
m1.put("B", 100l);
Map m2 = new HashMap<>();
m2.put("A", 10l);
m2.put("B", 20l);
m2.put("C", 100l);
List> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);
Map> afterFormatting =
beforeFormatting.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
System.out.println(afterFormatting); // prints {A=[1, 10], B=[100, 20], C=[100]}
}