最近在项目中使用Optional,有一处用得不合理的地方,
如下代码:
Optional> orderInfoDtosOptional = Optional.ofNullable(
// 查询数据库
orderInfoService.getOrderInfo(startDate, endDate, orderType)
);
// 继续操作
if (orderInfoDtosOptional.isPresent()) {
List orderInfoDtos = orderInfoDtosOptional.get();
// 出现异常 java.util.NoSuchElementException: No value present
}
然后使用orderInfoDtosOptional.isPresent()去判断是否有值,这样就出现了一个问题。这行orderInfoService.getOrderInfo(startDate, endDate, orderType)代码不会返回null,如果在数据库中没有找到数据,返回size=0的一个 ArrayList对象,不会返回null, Optional主要是判断null的,在使用orderInfoDtosOptional.isPresent()去判断时返回true, 然后对这个空List对象操作时就出现异常了。
可以执行下面这段代码重现一下这个异常:
List a = new ArrayList<>();
Optional> 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()去判断集合对象是否为空,然后再做相应的操作。