在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);
}
}
答案 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。