SanRyu :
Firstly: I can't figure a proper title for this post.
Secondly: I have 2 lists and I am trying to merge/update some of the list properties base on one key.
List<MyClass> result = new ArrayList<MyClass>();
List<MyClass> intermediaryData = new ArrayList<MyClass>();
Both lists have the same T as MyClass which contains:
public String externalId; -- This is the unique id
public String companyName;
public String fiscalNumber;
public Integer noEmployees;
public Integer yearMonth;
List "result" contains:
externalId = "123"
companyName = "Demo"
List "intermediaryData" contains:
externalId = "123"
fiscalNumber= "84564213"
noEmployees = 12
yearMonth = 201812
Now, I can not figure a way to merge this 2 list base on "externalId" property so that I will have a final list with all properties set.
Eq:
externalId = "123"
companyName = "Demo"
fiscalNumber= "84564213"
noEmployees = 12
lastCloseYearMonth = 201812
I can make it with 2 fors, but is there a "faster" way using stream.
for (ClientPayrollDataSummaryDTO r : result)
for (ClientPayrollDataSummaryDTO rs : returnedSummaryList)
if (r.externalId.contains(rs.externalId)) {
r.fiscalNumber = rs.fiscalNumber;
r.lastCloseYearMonth = rs.lastCloseYearMonth;
....
}
Naman :
You can use the following assuming an appropriate constructor :
List<MyClass> finalList = new ArrayList<>();
result.forEach(m1 -> intermediaryData.stream()
.filter(m2 -> m2.getExternalId().equals(m1.getExternalId()))
.map(m2 -> new MyClass(m1.getExternalId(), m1.getCompanyName(), m2.getFiscalNumber(), m2.getNoEmployees(), m2.getYearMonth()))
.forEach(finalList::add));
Or alternatively, could try and use the
mergeFunction
as
List<MyClass> finalMappedValues = new ArrayList<>(Stream.concat(result.stream(), intermediaryData.stream())
.collect(Collectors.toMap(MyClass::getExternalId, Function.identity(),
(a, b) -> new MyClass(a.getExternalId(), a.getCompanyName(), b.getFiscalNumber(), b.getNoEmployees(), b.getYearMonth())))
.values());