Optional的一個坑

最近在項目中使用Optional,有一處用得不合理的地方,
如下代碼:

Optional<List<OrderInfoDto>> orderInfoDtosOptional = Optional.ofNullable(
// 查詢數(shù)據(jù)庫
orderInfoService.getOrderInfo(startDate, endDate, orderType)
);
// 繼續(xù)操作
if (orderInfoDtosOptional.isPresent()) {
  List<OrderInfoDto> orderInfoDtos = orderInfoDtosOptional.get();
  // 出現(xiàn)異常 java.util.NoSuchElementException: No value present
}

然后使用orderInfoDtosOptional.isPresent()去判斷是否有值,這樣就出現(xiàn)了一個問題。這行orderInfoService.getOrderInfo(startDate, endDate, orderType)代碼不會返回null,如果在數(shù)據(jù)庫中沒有找到數(shù)據(jù),返回size=0的一個 ArrayList<OrderInfoDto>對象,不會返回null, Optional主要是判斷null的,在使用orderInfoDtosOptional.isPresent()去判斷時返回true, 然后對這個空List對象操作時就出現(xiàn)異常了。

可以執(zhí)行下面這段代碼重現(xiàn)一下這個異常:

   List<Double> a = new ArrayList<>();
   Optional<List<Double>> one1 = Optional.of(a);
   System.out.println(one1.isPresent());
   if (one1.isPresent()) { // 沒有達到我預(yù)想的效果
       double b = one1.get().stream().mapToDouble(x -> x).average().getAsDouble();
   }

所以在對Collection進行操作的時候,使用Optional就要小心了,最好不要使用Optional去盛裝一個Collection對象,結(jié)合commons庫的Collections.isNotEmpty()MapUtils.isNotEmpty()去判斷集合對象是否為空,然后再做相應(yīng)的操作。

參考鏈接: http://www.importnew.com/6675.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,724評論 19 139
  • 就這樣七年過去了,看到滿院的落葉卷著這柔和的風(fēng),一片一片的思念就這么散落著,我想到了以前的同事,以前的活動,以前的...
    令令今今閱讀 149評論 0 0
  • 17號傍晚,我坐在病床前與一朋友聊天。突然感覺腰酸,就躺下來,朋友慌忙給我搖床,剛躺下,覺得身下熱呼呼的,低頭一看...
    嘉俐閱讀 574評論 0 0
  • 在四年級的時候,我們正在上體育課。 記得在這節(jié)體育課上,發(fā)生了一件令我難過的事,上體育課的我們在操場上排好隊,突...
    秦淑怡閱讀 346評論 0 0

友情鏈接更多精彩內(nèi)容