Optional的一个坑

0.264字数 241阅读 2582

最近在项目中使用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()去判断集合对象是否为空,然后再做相应的操作。

参考链接: http://www.importnew.com/6675.html

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
  • 就这样七年过去了,看到满院的落叶卷着这柔和的风,一片一片的思念就这么散落着,我想到了以前的同事,以前的活动,以前的...
  • #翻船体#“友谊的小船说翻就翻”说热就热,它从哪里冒出来的?谁借了它的势?谁占了它的利? 网络体就是酱紫,说热就热...
  • 17号傍晚,我坐在病床前与一朋友聊天。突然感觉腰酸,就躺下来,朋友慌忙给我摇床,刚躺下,觉得身下热呼呼的,低头一看...
  • 在四年级的时候,我们正在上体育课。 记得在这节体育课上,发生了一件令我难过的事,上体育课的我们在操场上排好队,突...