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


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

Optional簡介

  • Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。

  • Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。

  • Optional 類的引入很好的解決空指針異常。

Optional源碼查看

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

類的屬性和方法

從圖中我們可以看出,它的構造方法都是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);
    }

好了,玩的開心.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM