<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 簡介 Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。 Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。 Optional 類的引入很好的解決空指針異常。 ~~~ public final class Optional<T> extends Object ~~~ # 類結構 ## Optional屬性 Optional類中包含兩個屬性: * 類屬性:EMPTY * 對象屬性:value EMPTY屬性用來存放一個value為null的Optional對象。 value屬性用來存放非null對象。 ## Optional方法 Optional的有兩個構造方法,都被private修飾。 ~~~ private Optional() { this.value = null; } private Optional(T value) { this.value = Objects.requireNonNull(value); } ~~~ 無參構造方法用來初始化EMPTY。有參構造方法用來初始化非null對象。 因為構造方法被修飾為私有的,Optional想要實例化對象只能通過類方法調用。Optional提供三個類方法。 * empty:返回value為null的Optional對象 * of:返回value非null的Optional對象 * ofNullable:value的值根據參數是否為null返回對應的Optional對象 ~~~ public static<T> Optional<T> empty() { Optional<T> t = (Optional<T>) EMPTY; return t; } public static <T> Optional<T> of(T value) { return new Optional<>(value); } public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } ~~~ 不得不提一下 Optional 的三種構造方式: ~~~ Optional.of(obj) , Optional.ofNullable(obj) 和明確的 Optional.empty() ~~~ Optional.of(obj) : 它要求傳入的 obj 不能是 null 值的, 否則還沒開始進入角色就倒在了 NullPointerException 異常上了. Optional.ofNullable(obj) : 它以一種智能的, 寬容的方式來構造一個 Optional 實例. 來者不拒, 傳 null 進到就得到 Optional.empty() , 非 null 就調用 Optional.of(obj) . 那是不是我們只要用 Optional.ofNullable(obj) 一勞永逸, 以不變應二變的方式來構造 Optional 實例就行了呢? 那也未必, 否則 Optional.of(obj) 何必如此暴露呢, 私有則可? 1. 當我們非常非常的明確將要傳給 Optional.of(obj) 的 obj 參數不可能為 null 時, 比如它是一個剛 new 出來的對象( Optional.of(new User(...)) ), 或者是一個非 null 常量時; 2. 當想為 obj 斷言不為 null 時, 即我們想在萬一 obj 為 null 立即報告 NullPointException 異常, 立即修改, 而不是隱藏空指針異常時, 我們就應該果斷的用 Optional.of(obj) 來構造 Optional 實例, 而不讓任何不可預計的 null 值有可乘之機隱身于 Optional 中. ## 實例方法介紹 ![](https://box.kancloud.cn/233bcdd3ab89e33701aae18f59d839f0_822x538.png) ## 常用方法 ~~~ Optional.of(T t) : 創建一個 Optional 實例 Optional.empty() : 創建一個空的 Optional 實例 Optional.ofNullable(T t):若 t 不為 null,創建 Optional 實例,否則創建空實例 isPresent() : 判斷是否包含值 T get(): 如果調用對象包含值,返回該值,否則拋異常 orElse(T t) :? 如果調用對象包含值,返回該值,否則返回t orElseGet(Supplier s) :如果調用對象包含值,返回該值,否則返回 s 獲取的值 map(Function f): 如果有值對其處理,并返回處理后的Optional,否則返回 Optional.empty() flatMap(Function mapper):與 map 類似,要求返回值必須是Optional ~~~ # 使用 ## empty empty方法通過工廠創建一個空的Optional. ~~~ Optional empty = Optional.empty(); ~~~ ## of of方法通過工廠方法創建Optional類 **注:創建對象時傳入的參數不能為null。如果傳入參數為null,則拋出NullPointerException。 ** ~~~ //調用工廠方法創建Optional實例 Optional<String> name = Optional.of("Sanaulla"); //傳入參數為null,拋出NullPointerException. Optional<String> someNull = Optional.of(null); ~~~ ## ofNullable ofNullable與of方法相似,唯一的區別是可以接受參數為null的情況 ~~~ //下面創建了一個不包含任何值的Optional實例 //例如,值為'null' Optional empty = Optional.ofNullable(null) ~~~ ## 判斷是否有值 isPresent用來判斷Optinal是否有值。如果值存在返回true,否則返回false ~~~ Optional emptyOptional = Optional.empty(); // emptyOptional為空,打印結果為true System.out.println(emptyOptional.isPresent()); Optional<String> ofOptional = Optional.of("wang"); // ofOptional有值,打印結果為true System.out.println(ofOptional.isPresent()); ~~~ ## 應避免` if(user.isPresent()) { ... } else { ... } `幾種方式 **存在即返回, 無則提供默認值** ~~~ return user.orElse(null); //而不是 return user.isPresent() ? user.get() : null; return user.orElse(UNKNOWN_USER); ~~~ **存在即返回, 無則由函數來產生** ~~~ return user.orElseGet(() -> fetchAUserFromDatabase()); //而不要 return user.isPresent() ? user: fetchAUserFromDatabase(); ~~~ **存在才對它做點什么** ~~~ user.ifPresent(System.out::println); //而不要下邊那樣 if (user.isPresent()) { System.out.println(user.get()); } ~~~ ## 轉換Optional ### filter filter方法接受一個條件函數,對Optional進行過濾。如果有值并且滿足斷言條件返回包含該值的Optional,否則返回空Optional。 ~~~ //filter方法檢查給定的Option值是否滿足某些條件。 //如果滿足則返回同一個Option實例,否則返回空Optional。 Optional<Integer> age = Optional.of(20); Optional<Integer> oldAge = age.filter(a -> a > 18); Optional<Integer> lessAge = age.filter(a -> a < 18); // 打印結果:Optional[20] System.out.println(oldAge); // 打印結果:Optional.empty System.out.println(lessAge); ~~~ ### map map方法用來對Optional實例的值執行一系列操作。通過一組實現了Function接口的lambda表達式傳入操作。如果有值,則對其執行調用mapping函數得到返回值。如果返回值不為null,則創建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。 ~~~ Optional emptyOptional = Optional.empty(); Optional<Integer> ageMap = Optional.of(20); Optional<String> ageMap_ = ageMap.map(a -> "ageMap:" + a); Optional<String> emptyMap = emptyOptional.map(a -> "ageMap:" + age); Optional<String> nullMap = ageMap.map(a -> null); // 打印結果:Optional[ageMap:20] System.out.println(ageMap_); // 打印結果:Optional.empty System.out.println(emptyMap); // 打印結果:Optional.empty System.out.println(nullMap); ~~~ ### flatMap 如果有值,為其執行mapping函數返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區別在于flatMap中的mapper返回值必須是Optional。調用結束時,flatMap不會對結果用Optional封裝。 ~~~ Optional<String> flat = Optional.of("hello flatMap"); Optional<String> flatMap = flat.flatMap(it -> Optional.of(it.toUpperCase())); // 打印結果:Optional[HELLO FLATMAP] System.out.println(flatMap); ~~~ ## 獲取Optional的值 ### get get方法將獲取Optional中value的值,如果存在值,則返回該值,否則拋出NoSuchElementException。 ~~~ Optional<String> getOptional = Optional.of("This is a Optional"); String valueOptional = getOptional.get(); // 打印結果:This is a Optional System.out.println(valueOptional); ~~~ ### orElse 如果Optional實例有值則將其返回,否則返回orElse方法傳入的參數。 ~~~ //如果值不為null,orElse方法返回Optional實例的值。 //如果為null,返回傳入的消息。 //輸出:There is no value present! System.out.println(empty.orElse("There is no value present!")); //輸出:Sanaulla System.out.println(name.orElse("There is some value!")); ~~~ ### orElseGet orElseGet與orElse方法類似,區別在于得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier接口的實現用來生成默認值。 ~~~ //orElseGet與orElse方法類似,區別在于orElse傳入的是默認值, //orElseGet可以接受一個lambda表達式生成默認值。 //輸出:Default Value System.out.println(empty.orElseGet(() -> "Default Value")); //輸出:Sanaulla System.out.println(name.orElseGet(() -> "Default Value")); orElseThrow ~~~ ### orElseThrow 在orElseGet方法中,我們傳入一個Supplier接口。然而,在orElseThrow中我們可以傳入一個lambda表達式或方法,如果值不存在來拋出異常。 ~~~ try { //orElseThrow與orElse方法類似。與返回默認值不同, //orElseThrow會拋出lambda表達式或方法生成的異常 empty.orElseThrow(ValueAbsentException::new); } catch (Throwable ex) { //輸出: No value present in the Optional instance System.out.println(ex.getMessage()); } ~~~ # lambda和optional結合 比如以下代碼 ~~~ if(authVo!=null){ String id=authVo.getId(); if(id==null) { id=""; } List<AuthVo> vos=authMapper.find(id); if(vos!=null){ for(AuthVo v : vos){ if(v!=null){ return v; } continue; } return new AuthVo(); } else { return new AuthVo(); } } else { return new AuthVo(); } ~~~ 通過java8的話,只需要這樣寫 ~~~ Optional.ofNullable(authVo).map(v -> { List<AuthVo> vos=authMapper.find(Optional.ofNullable(v.getId()).orElse("")); v=Optional.ofNullable(vos) .orElse(new ArrayList<AuthVo>()) .stream() .filter(vo -> vo!=null) .findFirst() .orElse(new AuthVo()); return v; }).orElse(new AuthVo()); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看