php isoptional,Optional的一个坑

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值