Один из подходов состоит в том, чтобы накапливать элементы списка logsData
в карте, где ключ logsData#getEventDate
объединяется с logsData#getCorrelationId
.
Map<String, LogsData> accumulator =
logsData.stream()
.collect(toMap(l -> l.getEventDate() + l.getCorrelationId(), Function.identity()));
, а затем передается по списку distributionData
и получить соответствующие элементы на карте, а затем преобразовать их в ResultBean
.
List<ResultBean> resultSet = distributionData.stream()
.map(d -> {
LogsData logs = accumulator.get(d.getEventDate() + d.getCorrelationId());
if (logs != null)
return new ResultBean(d.getEventDate(), d.getCorrelationId(),
d.getCallingProId(), d.getTransactionCount(), logs.getAuthId(), logs.getNumberofSQL());
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
, что предполагает, что ResultBean
имеет конструктор, принимающий все необходимые аргументы, если это не так, тогда просто вызовите установщикметоды для установки необходимых данных.
import:
import static java.util.stream.Collectors.*;
import java.util.stream.*;
import java.util.function.*;
другой подход, хотя и менее эффективный:
List<ResultBean> resultSet = logsData.stream()
.map(l -> distributionData.stream()
.filter(d -> l.getEventDate().equals(d.getEventDate()) &&
l.getCorrelationId().equals(d.getCorrelationId()))
.findFirst()
.map(d -> new ResultBean(d.getEventDate(), d.getCorrelationId(),
d.getCallingProId(), d.getTransactionCount(), l.getAuthId(), l.getNumberofSQL()))
.orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
немного другой, в JDK9 во избежание .orElse(null)).filter(Objects::nonNull)
шаблон:
List<ResultBean> resultSet = logsData.stream()
.flatMap(l -> distributionData.stream()
.filter(d -> l.getEventDate().equals(d.getEventDate()) &&
l.getCorrelationId().equals(d.getCorrelationId()))
.findFirst()
.map(d -> new ResultBean(d.getEventDate(), d.getCorrelationId(),
d.getCallingProId(), d.getTransactionCount(), l.getAuthId(), l.getNumberofSQL()))
.stream()
)
.collect(Collectors.toList());