1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Java8 之 Optional 判空,簡化判空操作

        共 4640字,需瀏覽 10分鐘

         ·

        2021-05-23 10:15

        點擊下方“IT牧場”,選擇“設(shè)為星標”

        來源:blog.csdn.net/MengW9/

        article/details/109000646

        • 一、導語
          • 為什么要用Optional,它到底是什么東西
        • 二、Optional使用
        • 三、Optional實例
          • 1.of
          • 2.ofNullable
          • 3.isPresent
          • 4.get
          • 5.ifPresent
          • 6.orElse
          • 7.orElseGet
          • 8.orElseThrow
          • 9.map
          • 10.flatMap
          • 11.filter
        • 四、小結(jié)

        一、導語

        在沒有用Optional判空之前,你是否也像下面的代碼一樣判空呢?如果是,請往下看,Optional 相對傳統(tǒng)判空的優(yōu)勢。

        傳統(tǒng)階層判空

        為什么要用Optional,它到底是什么東西

        你也看到了上面的那張圖,一旦代碼量大起來了,條件多了,代碼就會變得很冗余,變得難以維護。那么此時我們就有必要了解Optional了。

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

        二、Optional使用

        • Optional 的方法,如下圖

        Optional方法-圖1

        Optional方法-圖2

        方法就是這么多,其他的也不必多說,相信各位小伙伴一看就懂;如何使用,還是用代碼演示,請往下移步。

        三、Optional實例

        1.of

        為非null的值創(chuàng)建一個Optional。of方法通過工廠方法創(chuàng)建Optional類。需要注意的是,創(chuàng)建對象時傳入的參數(shù)不能為null。如果傳入?yún)?shù)為null,則拋出NullPointerException 。

        Optional<String> optional = Optional.of("xiaoming");
        //傳入null,拋出NullPointerException
        Optional<Object> o = Optional.of(null);

        2.ofNullable

        為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。

        Optional<Object> o1 = Optional.ofNullable(null);

        3.isPresent

        值存在返回true,否則返回false

        Optional<String> optiona2 = Optional.of("xiaoming");
        System.out.println(optiona2.isPresent());

        4.get

        Optional有值就返回,沒有拋出NoSuchElementException

        Optional<Object> o1 = Optional.ofNullable(null);
        System.out.println(o1.get());

        5.ifPresent

        如果Optional有值則調(diào)用consumer處理,否則不處理

        Optional<Object> o1 = Optional.ofNullable(null);
         o1.ifPresent(s -> System.out.println(s));

        6.orElse

        如果有值則將其返回,否則返回指定的其它值

        Optional<Object> o1 = Optional.ofNullable(null);
        System.out.println(o1.orElse("輸出orElse")); // 輸出orElse

        7.orElseGet

        orElseGet與orElse方法類似,區(qū)別在于得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier接口的實現(xiàn)用來生成默認值

        Optional<Object> o1 = Optional.ofNullable(null);
        System.out.println(o1.orElseGet(() -> "default value")); // default value

        *注意:orElse 和 orElseGet 看似差不多,其實有很大不同;看下面例子

        Shop shop = null;
        System.out.println("test orElse");
        Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
        Optional.ofNullable(shop).orElseGet(()->createNew());
        //createNew
        private static Shop createNew() {
             System.out.println("create new");
          return new Shop("尺子"50);
        }//輸出:
        test orElsecreate newtest orElseGetcreate new
        Shop shop = new Shop("鋼筆",100);
        System.out.println("test orElse");
        Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
        Optional.ofNullable(shop).orElseGet(()->createNew());
        //輸出
        test orElsecreate newtest orElseGet

        從上面兩個例子可以看到,當Optional 為空時,orElse和orElseGet 區(qū)別不大,但當Optional有值時,orElse仍然會去調(diào)用方法創(chuàng)建對象,而orElseGet不會再調(diào)用方法;在我們處理的業(yè)務數(shù)據(jù)量大的時候,這兩者的性能就有很大的差異。


        8.orElseThrow

        如果有值則將其返回,否則拋出supplier接口創(chuàng)建的異常。

        Optional<Object> o1 = Optional.ofNullable(null);
        try {

          o1.orElseThrow(() -> new Exception("異常!"));
        catch (Exception e) {

          System.out.println("info:" + e.getMessage());
        }//輸出:info:異常!

        9.map

        如果有值,則對其執(zhí)行調(diào)用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。

        Optional<String> optional = Optional.of("xiaoming");
        String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
        System.out.println(s); //輸出: XIAOMING

        10.flatMap

        如果有值,為其執(zhí)行mapping函數(shù)返回Optional類型返回值,否則返回空Optional。與map不同的是,flatMap 的返回值必須是Optional,而map的返回值可以是任意的類型T

        Optional<String> optional = Optional.of("xiaoming");
        Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase()));
        System.out.println(s.get()); //輸出:XIAOMING

        11.filter

        List<String> strings = Arrays.asList("rmb""doller""ou");
        for (String s : strings) {

          Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o"));
          System.out.println(o.orElse("沒有不包含o的"));
        }//輸出:
        rmb
        沒有不包含o的
        沒有不包含o的

        四、小結(jié)

        Optional 是java非常有用的一個補充,它旨在減少代碼中的NullPointerExceptions,雖然不能百分之百的消除,但也是精心設(shè)計的。使用Optional 能更好的幫助我們創(chuàng)建可讀性強,bug更少的應用程序。

        干貨分享

        最近將個人學習筆記整理成冊,使用PDF分享。關(guān)注我,回復如下代碼,即可獲得百度盤地址,無套路領(lǐng)取!

        ?001:《Java并發(fā)與高并發(fā)解決方案》學習筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學習筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動設(shè)計速成)》?007:全部?008:加技術(shù)群討論

        關(guān)注我

        喜歡就點個"在看"唄^_^


        瀏覽 25
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91麻豆精品国产自产在线观看一区 | 国产欧美一级 | 精品国产一区一区二区三亚瑟 | 久久97久久 | 岳乱妇乱第13集 | 无码国产精品一区二区色情八戒 | 三级黄片在线免费观看 | 嗯嗯啊啊视频网站 | 我要色色网 | a√免费看 |