我尝试使用stream来管理dto到bean。
List<CarDto> carsDto = dto.getCars();
List<Cars> cars = bean.getCars();
for (Cars car : cars) {
if (carsDto==null || carsDto.stream().noneMatch(c -> c.getId().intValue() == car.getId())) {
bean.removeCars(car);
}
}
实际上当carsDto的元素为null时,我得到空指针异常。
当element为null时,我想做
bean.removeCars(car);
答案 0 :(得分:1)
Stream.allMatch
,.noneMatch
,anyMatch
和减少为单boolean
的任何缩减功能都不能单独执行此操作,因为当您想要移除汽车时< strong>否 dto与汽车相匹配,当任何 dto为null
时,您想将其删除。
如果你不介意两次糟糕的表演,你总是可以使用两个流管道,但我会建议如下:
List<CarDto> carsDto = dto.getCars();
List<Cars> cars = bean.getCars();
if (carsDto == null || carsDto.stream().anyMatch(Objects::isNull)) {
cars.forEach(car -> bean.removeCars(car)); //remove all cars when the dto list is null or contains a null dto
} else {
cars.stream().filter(car -> //select cars with a corresponding dto
carsDto.stream().anyMatch(dto ->
car.getId() == dto.getId().intValue()
)
).forEach(car -> bean.removeCars(car)); //and remove them
}
答案 1 :(得分:1)
堆栈跟踪或关于类的一些代码会非常有用。我的赌注是NPE出现在包含null
的行中,并且来自int
被转换为原始c.getId() // returns null or
car.getId() // returns null
中的一个:
dto.getCars()
如果NPE不是来自其中之一,那么List
可能会返回null
bean.removeCars(car)
值或Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: from near line 1, column 9 [select from com.app.company.domain.organization.Organization as generatedAlias0 where generatedAlias0.deletedAt is null]
投出NPE ......