Поток Java не соответствует нескольким условиям - PullRequest
0 голосов
/ 08 мая 2018

В преобразовании бина в dto,

Я пытаюсь добавить dto, только если dto не найден в bean-компоненте ... или если id dto равен нулю

Я использую поток без совпадений.

Когда я пытаюсь добавить много машин, добавляется только первая

 List<Car> cars = bean.getCar();
 List<CarDto> carsDto = dto.getCar();

 for (CarDto carDto : carsDto) {

     if (cars.stream().noneMatch(e -> Objects.equals(e.getId(), carDto.getId()) || carDto.getId()==null )) {

        //get car from bd....

        bean.addCar(car);
    }

}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы также можете полностью использовать потоковый API, не прибегая к императивному циклу:

List<Car> cars = bean.getCar();
List<CarDto> carsDto = dto.getCar();

Set<String> carSet = cars.stream()
       .map(car -> car.getId()).collect(Collectors.toSet());

carsDto.stream()
       .filter(car -> car.getId() == null || !carSet.contains(car.getId()))
       .forEach(bean::addCar);

Если Car сопоставимо с id, вы также можете просто использовать carSet.contains(car) и избегать предварительного создания набора идентификаторов автомобилей.

0 голосов
/ 08 мая 2018

Наличие условия carDto.getId()==null в пределах noneMatch не позволит вам принять CarDto с нулевым идентификатором.

Вы можете изменить его как

if (carDto.getId() == null 
         || cars
             .stream()
             .noneMatch(e -> Objects.equals(e.getId(), carDto.getId()))) 

UPDATE:

Спасибо Хольгеру @ за это предложение: вы можете упростить второе условие if как (и вам не нужно использовать Objects.equals, поскольку carDto.getId не может быть нулевым.

cars.stream()
    .map(Car::getId)
    .noneMatch(carDto.getId()::equals)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...