Java流无匹配多个条件

时间:2018-05-08 17:08:28

标签: java java-8

在dto to bean转换中,

我尝试仅在bean中找不到dto时才添加dto ...或者如果dto的id为null

我使用没有匹配的流。

当我尝试添加许多汽车时,只添加了第一个汽车

 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 :(得分:5)

carDto.getId()==null中的条件noneMatch将阻止您获取具有空ID的CarDto

您可以将其更改为

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

<强>更新

感谢Holger @提出的建议:您可以将第二个if条件简化为(并且无需使用Objects.equals,因为carDto.getId不能为空。

cars.stream()
    .map(Car::getId)
    .noneMatch(carDto.getId()::equals)

答案 1 :(得分:2)

您还可以完全使用流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)并避免预先创建购物车ID。