Как перебрать несколько списков и создать другой список с объединением уникальных значений из обоих списков, используя лямбда-выражения Java 8
Я пишу код для обхода нескольких списков и создания другого списка со слиянием уникальных значений из обоих списков с использованием лямбда-выражений Java 8.
Модельный класс:
class ServiceMap{
Integer serviceMapId;
Integer seviceId;
}
Кодовая логика:
List<ServiceMap> listA = getServiceMaps();//Will get from database
List<Integer> listB = Arrays.asList(1, 10, 9);//Will get from client
List<ServiceMap> listC = new ArrayList<>();//Building it merging of both lists above
listA.stream().forEach(e -> {
if (listB.parallelStream().noneMatch(x -> x == e.getServiceId())) {
listC.add(new ServiceMap(e.getServiceId()));
return;
}
listB.stream().forEach(x -> {
if (listC.stream().anyMatch(e2->e2.getServiceId() == x)) {
return;
}
if (x == e.getServiceId()) {
listC.add(new ServiceMap(e.getServiceId()));
} else {
listC.add(new ServiceMap(x));
}
});
});
listC.stream().forEach(x -> System.out.println(x));
Это эффективный способ написания кода с использованием Java-лямбда-выражений?
2 ответа
Вы можете потоковое каждый список, применить distinct
к ним и собирать
List<Integer> result =
Stream.concat(listA.stream(), listB.stream())
.distinct()
.collect(Collectors.toList());
Вы должны использовать также как это;
Stream<Integer> streamOfServiceMapIds = listA.stream().map(ServiceMap::getSeviceId);
List<ServiceMap> collectedList = Stream.concat(streamOfServiceMapIds, listB.stream())
.distinct()
.map(ServiceMap::new)
.collect(Collectors.toList());