I have a list of objects shown below:
public class AssignDTO {
private String assignmentIbanId;
private String agreementFileId;
private BankData bankData;
// getter and setter
}
[
{
"assignmentIbanId":"6146dd87-2344-4149-9396-8e8a88493dd6",
"agreementFileId":"36de8604-ae56-49b3-b972-8071b459bf82",
"bankData": { "useType" : "a" }
},
{
"assignmentIbanId":"44cb8cc6-fe28-4e44-a78c-48a908795f38",
"agreementFileId":"854f0c37-b9d8-4533-9c02-0c1b64a909bd",
"bankData": { "useType" : "b" }
},
{
"assignmentIbanId":"44cb8cc6-fe28-4e44-a78c-48a908795f38",
"agreementFileId":"854f0c37-b9d8-4533-9c02-0c1b64a909bd",
"bankData": { "useType" : "c" }
}
]
How can I group the list by agreementFileId
and agreementFileId
fields like below
public class ResultDTO {
private String assignmentIbanId;
private String agreementFileId;
private Set<BankData> bankAccounts;
// getter and setter
}
[
{
"assignmentIbanId":"6146dd87-2344-4149-9396-8e8a88493dd6",
"agreementFileId":"36de8604-ae56-49b3-b972-8071b459bf82",
"bankAccounts": [{ "useType" : "a" }]
}
{
"assignmentIbanId":"44cb8cc6-fe28-4e44-a78c-48a908795f38",
"agreementFileId":"854f0c37-b9d8-4533-9c02-0c1b64a909bd",
"bankAccounts": [{ "useType" : "b" }, { "useType" : "c" }]
}
]
As the first step, you might either create a nested map applying the
Collector.groupingBy()
twice, or group the data using an object that is capable to carry two values, like aMap.Entry
, as a key.In both cases, a combination of
mapping()
andtoSet()
would be handy as a downstream collector:As a result, it'll produce an intermediate map having
Set<BankData>
as its values.Then create a stream over the entry set and apply
map()
to turn each entry into aResultDTO
and collect the result into a list either withtoList()
(Java 16+) or by utilizingCollectors.toList()
.That's how it might look like (example with map entry for Java-8):
Output