Reputation: 9586
I want to take a List<Pojo>
and return
a Map<String, List<Pojo>>
where the Map
's key is a String
value in Pojo
, let's call it String key
.
To clarify, given the following:
Pojo 1: Key:a value:1
Pojo 2: Key:a value:2
Pojo 3: Key:b value:3
Pojo 4: Key:b value:4
I want a Map<String, List<Pojo>>
with keySet()
sized 2, where key "a" has Pojos 1 and 2, and key "b" has pojos 3 and 4.
How could I best achieve this using Java 8 lambdas?
Upvotes: 62
Views: 57905
Reputation: 3816
Also, if you wanted to return a similar map but instead of whole Pojo you wanted the map's values be some property of the Pojo, you would do like that:
Map<String, List<String>> map = pojos
.stream()
.collect(
Collectors.groupingBy(
Employee::getKey,
Collectors.mapping(
Pojo::getSomeStringProperty,
Collectors.toList()
)
)
);
Upvotes: 57
Reputation: 394126
Use the simple groupingBy
variant:
Map<String, List<Pojo>> map = pojos
.stream()
.collect(
Collectors.groupingBy(Pojo::getKey)
);
Upvotes: 124