Скопируйте некоторые свойства из одного списка в другой на основе свойства (различные свойства объединяются) - PullRequest
0 голосов
/ 04 декабря 2018

Во-первых: я не могу найти правильный заголовок для этого поста.

Во-вторых: у меня есть 2 списка, и я пытаюсь объединить / обновить некоторые свойства списка на основе одного ключа.

List<MyClass> result = new ArrayList<MyClass>();
List<MyClass> intermediaryData = new ArrayList<MyClass>();

Оба списка имеют тот же T, что и MyClass, который содержит:

public String externalId; -- This is the unique id
public String companyName;
public String fiscalNumber;
public Integer noEmployees;
public Integer yearMonth;

Список "result" содержит:

externalId = "123"
companyName = "Demo"

Список "middlearyData" содержит:

externalId = "123"
fiscalNumber= "84564213"
noEmployees = 12
yearMonth = 201812

Теперь я не могу придумать, как объединить эти 2 списка базы со свойством "externalId", чтобы у меня был окончательный список со всеми установленными свойствами.

Уравнение:

externalId = "123"
companyName = "Demo"
fiscalNumber= "84564213"
noEmployees = 12
lastCloseYearMonth = 201812

Я могу сделать это с 2 форсами, но есть ли более быстрый способ использования потока.

for (ClientPayrollDataSummaryDTO r : result)
    for (ClientPayrollDataSummaryDTO rs : returnedSummaryList)
        if (r.externalId.contains(rs.externalId)) {
            r.fiscalNumber = rs.fiscalNumber;
            r.lastCloseYearMonth = rs.lastCloseYearMonth;
            ....
        }

1 Ответ

0 голосов
/ 04 декабря 2018

При использовании соответствующего конструктора можно использовать следующее:

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

Или, в качестве альтернативы, можно попробовать использовать mergeFunction в качестве

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

...