在流中管理null无匹配

时间:2018-02-08 14:20:06

标签: java

我尝试使用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);

2 个答案:

答案 0 :(得分:1)

Stream.allMatch.noneMatchanyMatch和减少为单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 ......