Copiar algunas propiedades del 1 lista a otra basada en la propiedad (propiedades distintas se fusionan)

SanRyu:

En primer lugar: No puedo imaginar un título adecuado para este puesto.

En segundo lugar: Tengo 2 listas y estoy tratando de fusionar / actualizar parte de la base de la lista de propiedades en una sola tecla.

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

Ambas listas tienen el mismo T como MyClass que contiene:

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

Lista de "número" contiene:

externalId = "123"
companyName = "Demo"

Lista "intermediaryData" contiene:

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

Ahora, no puedo imaginar una manera de combinar esta base de la lista 2 en la propiedad "externalId", por lo que voy a tener una lista final con todas las propiedades establecidas.

la ecuación:

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

Puedo hacer con 2 Fors, pero hay una manera "más rápido" por medio de la corriente.

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

Se puede utilizar el siguiente suponiendo un constructor apropiado:

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

O, alternativamente, podría tratar de usar la mergeFunction tan

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=212410&siteId=1
Recomendado
Clasificación