1つのリストからプロパティに基づいて別のものにいくつかのプロパティをコピーします(個別のプロパティがマージ)

SanRyu :

まず:私はこの記事のために適切なタイトルを理解することはできません。

第二に:私は2つのリストを持っていると私は更新/ 1キーのリストプロパティベースの一部をマージしようとしています。

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

両方のリストには含まれていMyClassのと同じTを持っています:

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

一覧「結果」は含まれています:

externalId = "123"
companyName = "Demo"

リスト「intermediaryDataは、」含まれています:

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

今、私はすべてのプロパティが設定された最終的なリストを持っていますように、「外部ID」プロパティでこの2リストのベースをマージする方法を理解することはできません。

式:

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

私は2つのFORSでそれを作ることができますが、ストリームを使用して「速い」方法があります。

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

あなたは適切なコンストラクタを想定して以下のように使用することができます。

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=212407&siteId=1