舉個栗子
public static void main(String[] args) { List<String> list = null; list.forEach(x -> System.out.println(x)); }
工作中經常會遇到,查詢返回空,如果沒有判空處理,一不小心就會空指針異常。加上if判斷處理也可以,但是jdk1.8有更優雅的處理方式。
public static void main(String[] args) { List<String> list = null; List<String> newList = Optional.ofNullable(list).orElse(Lists.newArrayList());
String s = null;
String result = Optional.ofNullable(s).orElse("值為空“);
newList.forEach(x -> System.out.println(x)); }
先解釋代碼含義:如果list集合不為空,將list集合賦值給newList;如果list集合為空創建一個空對象集合賦值給newList,保證list集合永遠不為空,也就避免了空指針異常。(為了更好的理解,分開寫了,比較庸俗,實際工作中都是一行搞定,哈哈哈)
再看看源碼:底層是怎么處理的,怎么就避免了空指針呢?
靜態變量 empty private static final Optional<?> EMPTY = new Optional<>(); //如果對象為空,執行empty()方法;不為空,執行of(value)方法 public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } public static <T> Optional<T> of(T value) { return new Optional<>(value); }
1.首先執行ofNullable()方法,如果T對象為空,執行empty()方法;不為空,執行of(value)方法;
2.empty()方法,初始化一個空對象Optional(空對象和null不是一回事哈);
3.of(value)方法,將泛型對象T用於Optional構造方法的參數上,返回一個有值的對象
4.經過上面兩步,從而保證了Optional不為null,避免了空指針;