2021
02/28
08:43
文章作者:

什么是Optional類 JDK 8 的optional類

NPE(Null Pointer Exception)一直是我們最頭疼的問題,也是最容易忽視的地方。NPE常是導(dǎo)致Java應(yīng)用程序失敗的最常見的原因。在日常研發(fā)工作中,經(jīng)常會處理各種變量、集合,但在使用的過程中,往往要進行空判斷,不然會出現(xiàn)NPE。

Optional類實際上是個容器:它可以保存類型T的值,或者僅僅保存null。Optional 類的引入很好的解決空指針異常。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。盡量避免在程序中直接調(diào)用Optional對象的get()和isPresent()方法,避免使用Optional類型聲明實體類的屬性。

    Optional.of(T t) : 創(chuàng)建一個 Optional 實例
    Optional.empty() : 創(chuàng)建一個空的 Optional 實例
    Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實例,否則創(chuàng)建空實例
    isPresent() : 判斷是否包含值
    orElse(T t) : 如果調(diào)用對象包含值,返回該值,否則返回t
    orElseGet(Supplier s) :如果調(diào)用對象包含值,返回該值,否則返回 s 獲取的值
    map(Function f): 如果有值對其處理,并返回處理后的Optional,否則返回Optional.empty()
    flatMap(Function mapper):與 map 類似,要求返回值必須是Optional

 
如何使用Optional類

下面代碼在兩個常用場景,對比使用Optional類后的代碼,可以看出,代碼簡潔很多。

第一個場景:判斷是否為空

    package com.java.bitmap;
     
    import java.util.Optional;
     
    public class OptionalDemo {
     
        public static void main(String[] args) {
            String name="kerry";
            // common way
            if (name!=null&&name.length()!=0){
                System.out.println(name.length());
            }
            //use optional way
            System.out.println(Optional.ofNullable(name).orElse("").length());
     
     
        }
    }

第二個場景:遍歷list對象

 

     public static void listIterator(List<Integer> list){
            // common way
            if (list!=null&&list.size()!=0){
                for (Integer tmp:list) {
                    System.out.println(tmp);
                }
            }
            //use optional way
            Optional.ofNullable(list).orElse(new ArrayList<>()).forEach(tmp->{System.out.println(tmp);});
        }

第三個場景:

 

    public User getUser(User user) throws Exception{
        if(user!=null){
            String name = user.getName();
            if("zhangsan".equals(name)){
                return user;
            }
        }else{
            user = new User();
            user.setName("zhangsan");
            return user;
        }
    }

 

    public User getUser(User user) {
        return Optional.ofNullable(user)
                       .filter(u->"zhangsan".equals(u.getName()))
                       .orElseGet(()-> {
                            User user1 = new User();
                            user1.setName("zhangsan");
                            return user1;
                       });
    }

 orElseGet和orElse相似,都可以自定義類型返回,前者支持lamaba表達式。
————————————————1

我們的服務(wù)

Our Services

新聞資訊

News Center 更多 +

聯(lián)系我們

Contact Us

咨詢熱線:

86-592-5151555

地址: 廈門市集美區(qū)軟件園三期A3棟504室

QQ:1039899831

固話:86-592-5151555

手機:18020730588(賴先生)

官網(wǎng):m.haymarketdoctors.com

微信二維碼

Copyright © 2000-2021 m.haymarketdoctors.com

閩網(wǎng)文〔2018〕11518-507號 | 閩ICP備17022492號-1

游戲作品版權(quán)歸原作者享有,如無意之中侵犯了您的版權(quán),請您按照《版權(quán)保護投訴指引》來信告知,本網(wǎng)站將應(yīng)您的要求刪除。