最近在項目中使用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)的操作。