最近在项目中使用Optional,有一处用得不合理的地方,
如下代码:
Optional<List<OrderInfoDto>> orderInfoDtosOptional = Optional.ofNullable(
// 查询数据库
orderInfoService.getOrderInfo(startDate, endDate, orderType)
);
// 继续操作
if (orderInfoDtosOptional.isPresent()) {
List<OrderInfoDto> orderInfoDtos = orderInfoDtosOptional.get();
// 出现异常 java.util.NoSuchElementException: No value present
}
然后使用orderInfoDtosOptional.isPresent()
去判断是否有值,这样就出现了一个问题。这行orderInfoService.getOrderInfo(startDate, endDate, orderType)
代码不会返回null
,如果在数据库中没有找到数据,返回size=0
的一个 ArrayList<OrderInfoDto>
对象,不会返回null
, Optional
主要是判断null
的,在使用orderInfoDtosOptional.isPresent()
去判断时返回true
, 然后对这个空List
对象操作时就出现异常了。
可以执行下面这段代码重现一下这个异常:
List<Double> a = new ArrayList<>();
Optional<List<Double>> one1 = Optional.of(a);
System.out.println(one1.isPresent());
if (one1.isPresent()) { // 没有达到我预想的效果
double b = one1.get().stream().mapToDouble(x -> x).average().getAsDouble();
}
所以在对Collection进行操作的时候,使用Optional就要小心了,最好不要使用Optional去盛装一个Collection对象,结合commons库的Collections.isNotEmpty()
或MapUtils.isNotEmpty()
去判断集合对象是否为空,然后再做相应的操作。