【问题标题】:Copy some properties from 1 list to another based on property (distinct properties merge)根据属性将一些属性从一个列表复制到另一个列表(不同的属性合并)
【发布时间】:2019-05-05 15:57:18
【问题描述】:

首先:我无法为这篇文章找到合适的标题。

其次:我有 2 个列表,我正在尝试基于一个键合并/更新一些列表属性。

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

现在,我想不出一种方法来合并这 2 个基于“externalId”属性的列表,以便我将拥有一个包含所有属性集的最终列表。

方程:

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;
            ....
        }

【问题讨论】:

    标签: java arraylist merge java-stream array-merge


    【解决方案1】:

    假设有适当的构造函数,您可以使用以下内容:

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

    【讨论】:

    • 谢谢。第一个正在工作。使用 3 个列表有点让人不知所措,但仍然如此。
    • 您的第二种方法看起来不错,您改变主意的具体原因有哪些?
    • @Aomine 两个原因,1. 我怀疑合并函数必须更聪明一点才能处理空值。 2. OP 说 第一个正在工作 所以我假设输入可能是这样的,第二个可能对他们来说失败(如果经过测试)
    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多