Copy some properties from 1 list to another based on property (distinct properties merge)

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());

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=102745&siteId=1