1. 程式人生 > >java8使用Optional來避免空指標異常(簡化程式碼)

java8使用Optional來避免空指標異常(簡化程式碼)

在最近的開發中遇到不少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就可以放心的遍歷而不需要擔心空指標異常了。