天天看點

java8新特性(三)_Optional類的使用

說實話,我第一次知道這個東西是從阿裡規約中,因為公司前一段時間一直在搞代碼稽核,我的代碼寫的就感覺很爛,就像規範下。讓别人看起來沒那麼爛。于是就開始看阿裡規約,在看到NPE處理的時候,上面提到用Optional類進行處理。這就是我第一次知道這個東東。

Optional簡介

  • Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會傳回true,調用get()方法會傳回該對象。
  • Optional 是個容器:它可以儲存類型T的值,或者僅僅儲存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
  • Optional 類的引入很好的解決空指針異常。

Optional源碼檢視

這裡建議大家自行閱讀其完整源碼,這裡隻分析filter 和 map 方法

類的屬性和方法

java8新特性(三)_Optional類的使用

從圖中我們可以看出,它的構造方法都是private修飾的。其實是一個單例模式的應用。

filter 方法

該方法是過濾方法,過濾符合條件的Optional對象,這裡的條件用Lambda表達式來定義。

public Optional<T> filter(Predicate<? super T> predicate) {
        //如果入參predicate對象為null将抛NullPointerException異常
        Objects.requireNonNull(predicate);
        //如果Optional對象的值為null,将直接傳回該Optional對象
        if (!isPresent())
            return this;
        //如果Optional對象的值符合限定條件(Lambda表達式來定義),傳回該值,否則傳回空的Optional對象
        else
            return predicate.test(value) ? this : empty();
    }           

map方法

map方法用于修改該值,并傳回修改後的Optional對象,一般會在多級取值的時候用到

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        //如果入參mapper對象為null将抛NullPointerException異常
        Objects.requireNonNull(mapper);
        //如果Optional對象的值為null,将直接傳回該Optional對象
        if (!isPresent())
            return empty();
        //執行傳入的lambda表達式,并傳回經lambda表達式操作後的Optional對象
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }           

實戰演練

判斷不為null然後進行操作

/**
     * 不為null時進行操作
     *
     * @param name
     */
    public static void doThing(String name) {
        if (name != null) {
            System.out.println(name);
        }
    }

    public static void doThingOptional(String name) {
        Optional.ofNullable(name)
                .ifPresent(System.out::println);
    }           

多層級取值

/**
     * 多級取值
     *
     * @param user
     * @return
     */
    public static String getAddress(UserEntity user) {
        if (user != null) {
            AddressEntity addressEntity = user.getAddressEntity();
            if (addressEntity != null) {
                String address = addressEntity.getAddress();
                if (address != null && address.length() > 3) {
                    return address;
                }

            }
        }

        return null;
    }

    public static String getAddressOptional(UserEntity user) {
        return Optional.ofNullable(user)
                .map(u -> u.getAddressEntity())
                .map(a -> a.getAddress())
                .filter(s -> s.length() > 3)
                .orElse(null);
    }           

好了,玩的開心.

學習不是要麼0分,要麼100分的。80分是收獲;60分是收獲;20分也是收獲。有收獲最重要。但是因為着眼于自己的不完美,最終放棄了,那就是徹底的0分了。