I’m trying to convert a pojo object that looks like
JavaScript
x
[
{
"type": "Preferred",
"ids": ["A", "B", "C"]
},
{
"type": "Non-preferred",
"ids": ["D", "E"]
},
{
"type": "Popular",
"ids": ["A", "D"]
}
]
into Map<String, List<String>>
, such as:
JavaScript
{
"A": ["Preferred", "Popular"],
"B": ["Preferred"],
"C": ["Preferred"],
"D": ["Non-preferred", "Popular"],
"E": ["Non-preferred"],
}
how can I accomplish this using stream? I preferably want to utilize stream into collect()
, instead of using forEach()
(which is basically a for-loop).
Thanks in advance.
EDIT: The pojo class looks something like:
JavaScript
class Pojo {
String type;
List<String> ids;
}
And I basically have List<Pojo>
Advertisement
Answer
You can do it using stream, create entry for each type and id combination and then do a group by
JavaScript
Map<String, List<String>> results = lists.stream()
.flatMap(obj->obj.getIds()
.stream()
.map(id->new AbstractMap.SimpleEntry<>(id,obj.getType())))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,Collectors.toList())));