I have a list of dto with following element. userSeqId
have duplicate values,
private int userSeqId;
private String firstName;
private String lastName;
private String acctAgencyNumber;
I am trying to use Java 8 Lambda to group by 'userSeqId' to a Map.
I want Map<Integer, List<String>>
where Key should be userSeqId
and Value is List of acctAgencyNumber
.
When I use
Map<Integer, List<UserBasicInfoDto>> superUserAcctMap = customerSuperUserList.stream()
.collect(Collectors.groupingBy(UserBasicInfoDto::getUserSeqId));
I get Map<Integer, List<UserBasicInfoDto>>
where key is userSeqId
but value is list of whole object.
With Java 8, you can convert a List to Map in one line using the stream() and Collectors. toMap() utility methods. The Collectors. toMap() method collects a stream as a Map and uses its arguments to decide what key/value to use.
Since the map contains a key, value pair, we need two lists to store each of them, namely keyList for keys and valueList for values. We used map's keySet() method to get all the keys and created an ArrayList keyList from them.
There is a dedicated version of groupingBy()
for your use case:
Map<Integer, List<String>> result = customerSuperUserList.stream()
.collect(Collectors.groupingBy(
UserBasicInfoDto::getUserSeqId,
Collectors.mapping(UserBasicInfoDto::getAcctAgencyNumber, toList())));
The key point of this is to use the helper mapping
collector, using which you can override the default groupingBy
behaviour.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With