<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          拜托!求求你不要在用 !=null 判空了!

          共 3559字,需瀏覽 8分鐘

           ·

          2020-11-12 16:09

          「導(dǎo)語」

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

          傳統(tǒng)階層判空

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

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

          Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調(diào)用get()方法會返回該對象。Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測。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?optional?=?Optional.of("xiaoming");??
          //傳入null,拋出NullPointerException??
          Optional?o?=?Optional.of(null);??
          `

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

          `Optional?o1?=?Optional.ofNullable(null);??
          `

          3.isPresent:值存在返回true,否則返回false

          `Optional?optiona2?=?Optional.of("xiaoming");??
          System.out.println(optiona2.isPresent());??
          `

          4.get:Optional有值就返回,沒有拋出NoSuchElementException

          `Optional?o1?=?Optional.ofNullable(null);??
          System.out.println(o1.get());??
          `

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

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

          6.orElse:如果有值則將其返回,否則返回指定的其它值

          `Optional?o1?=?Optional.ofNullable(null);??
          System.out.println(o1.orElse("輸出orElse"));?//?輸出orElse??
          `

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

          `Optional?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??
          `

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


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

          `Optional?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?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?optional?=?Optional.of("xiaoming");??
          Optional?s?=?optional.flatMap(e?->?Optional.of(e.toUpperCase()));??
          System.out.println(s.get());?//輸出:XIAOMING ?
          `

          11.filter

          `List?strings?=?Arrays.asList("rmb",?"doller",?"ou");??
          for?(String?s?:?strings)?{??
          ??Optional?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)建可讀性強(qiáng),bug更少的應(yīng)用程序。

          ——————END——————


          歡迎關(guān)注“Java引導(dǎo)者”,我們分享最有價值的Java的干貨文章,助力您成為有思想的Java開發(fā)工程師!


          瀏覽 42
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                    <th id="afajh"><progress id="afajh"></progress></th>
                    亚洲精品字幕在线 | 久久青青精品 | 天天拍拍日日拍拍 | 伊人网在线成人在线视频 | 无码1区|