list 中 stream 判空
問題:
1.在對使用lamda表示式的stream對list進行處理時,如果list是null將會有讓人難受的NPE
2.在每個list.stream()前都if(list!=null)又不夠優雅
3.在對list中物件進行操作時也得if()避免NPE,程式碼顯得臃腫
優雅解決:
1.在操作前對list本身進行判空處理
使用Optional進行判空處理,如下:
Optional.ofNullable(allList).orElse(new ArrayList<>()).stream()
在list為null時,返回一個空list物件,否則執行stream後的操作
- orElse:如果值為空,返回一個物件
- orElseGet:如果值為空,執行一段lambda並返回一個物件
如:orElseGet(()->new ArrayList<>());
2.在對list中物件操作時判空處理
//去除list列表中的空物件
list1.stream().filter(Objects::nonNull).map();
3.在對兩個list進行addall()操作時,判空處理
Optional.ofNullable(list1).orElse(new ArrayList<>()).addAll(list2);
list的判空addall
但是上面程式碼在list2是null的時候還是會報NPE,所以list2也得加上判斷
Optional.ofNullable(list1).orElse(new ArrayList<>()).addAll(Optional.ofNullable(list2).orElse(new ArrayList<>()));
如果有多個list需要addall,通常第一個list new出來,如下:
List
list1.addll(Optional.ofNullable(list2).orElse(new ArrayList<>()));
list1.addll(Optional.ofNullable(list3).orElse(new ArrayList<>()));