根据 属性 将一些属性从 1 个列表复制到另一个列表(不同的属性合并)
Copy some properties from 1 list to another based on property (distinct properties merge)
首先:我想不出一个合适的标题 post。
其次:我有 2 个列表,我正在尝试 merge/update 基于一个键的一些列表属性。
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;
列表 "result" 包含:
externalId = "123"
companyName = "Demo"
列表 "intermediaryData" 包含:
externalId = "123"
fiscalNumber= "84564213"
noEmployees = 12
yearMonth = 201812
现在,我想不出一种方法来合并这两个基于 "externalId" 属性 的列表,这样我将得到一个包含所有属性集的最终列表。
当量:
externalId = "123"
companyName = "Demo"
fiscalNumber= "84564213"
noEmployees = 12
lastCloseYearMonth = 201812
我可以用 2 个 for 来实现,但是有没有 "faster" 使用流的方法。
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());
首先:我想不出一个合适的标题 post。
其次:我有 2 个列表,我正在尝试 merge/update 基于一个键的一些列表属性。
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;
列表 "result" 包含:
externalId = "123"
companyName = "Demo"
列表 "intermediaryData" 包含:
externalId = "123"
fiscalNumber= "84564213"
noEmployees = 12
yearMonth = 201812
现在,我想不出一种方法来合并这两个基于 "externalId" 属性 的列表,这样我将得到一个包含所有属性集的最终列表。
当量:
externalId = "123"
companyName = "Demo"
fiscalNumber= "84564213"
noEmployees = 12
lastCloseYearMonth = 201812
我可以用 2 个 for 来实现,但是有没有 "faster" 使用流的方法。
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());