java8使用Optional來避免空指標異常(簡化程式碼)
阿新 • • 發佈:2018-11-04
在最近的開發中遇到不少java.lang.NullPointerException異常 ,而為了避免這個異常,不免要利用if-else來進行判斷。比如如下的程式碼:
public static void main(String[] args) { List<String> fruits = getFruits(); if(fruits != null) { // To do fruits.forEach(fruit -> System.out.println(fruit)); } }
我們打算對fruits利用增強for迴圈遍歷,那如果沒有判空的話,就會丟擲空指標異常。
明明就是很簡單的邏輯,卻一定要有一個if來判空,越想越覺得難受。後來突然發現原來java8中已經新增了特性幫助我們解決這個問題,那就是Optional類。先瞅一眼這Optional類是個啥:
public final class Optional<T> { /** * Common instance for {@code empty()}. */ private static final Optional<?> EMPTY = new Optional<>(); /** * If non-null, the value; if null, indicates no value is present */ private final T value;
簡單看一眼原始碼,Optional裡面有一個final修飾的泛型變數,就應該是我們使用Optional的關鍵變量了。
接下來看一下,針對最開始的問題,使用Optional應該怎樣解決呢:
public static void main(String[] args) { List<String> fruits = getFruits(); if(fruits != null) { // To do // fruits.forEach(fruit -> System.out.println(fruit)); Optional.ofNullable(fruits).orElse(Collections.emptyList()).forEach(fruit -> System.out.println(fruit)); } }
這裡有兩個方法,ofNullable(),以及orElse(),我們首先看ofNullable()原始碼:
/**
* Returns an {@code Optional} describing the specified value, if non-null,
* otherwise returns an empty {@code Optional}.
*
* @param <T> the class of the value
* @param value the possibly-null value to describe
* @return an {@code Optional} with a present value if the specified value
* is non-null, otherwise an empty {@code Optional}
*/
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
很簡單,判斷引數是否為空,返回一個value為empty的Optional物件 或者 value為引數的Optional物件。
然後是orElse():
/**
* Return the value if present, otherwise return {@code other}.
*
* @param other the value to be returned if there is no value present, may
* be null
* @return the value, if present, otherwise {@code other}
*/
public T orElse(T other) {
return value != null ? value : other;
}
這裡,可以看到,對於剛才利用ofNullable()獲得的物件,我們判斷它是不是為空,如果是空,可以人為傳進去一個引數,比如最開始的例子,傳了一個Collections.emptyList();否則,value值保持不變。
這樣一來,我們獲得了一個value是我們想要的值的Optional例項,之後使用forEach就可以放心的遍歷而不需要擔心空指標異常了。