<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      java Stream之Optional API

      摘要:介紹Stream的容器類中 Optional 方法。

      綜述

      ??仰慕 Stream 流久矣,終于有機會徹底的了解其特性以及用法了,關于源碼的理解還需要持續增加深度。在學習 Stream 的時候,同時認識了強大的 Optional,本文就介紹 Optional 的API。

      ??Optional 是Java 8提供的一個容器類,用來裝載可能為空的引用。作為java程序員,經常在業務邏輯中檢查對象是否為空,引入Optional可以很友好地解決空指針異常,避免顯式進行空值檢測,提高代碼的可讀性和可維護性。

      Optional類的API

      Optional of(T t)

      ??使用靜態方法 of(T t) 創建一個非空的 Optional 對象。注意:傳遞的參數t必須是非空的,也就是說不能為 null;否則,拋出空指針異常NullPointerException。

      Optional ofNullable(T t)

      ??使用靜態方法 ofNullable(T t) 創建一個即可空又可非空的 Optional 對象。

      ??Optional可以通過工廠方法of()、ofNullable()和empty()創建實例,示例如下:

      // 創建非空的Optional實例
      Optional<String> optional = Optional.of(“hello”);
      // 創建值為空的的Optional對象
      Optional<String> optOrNull = Optional.ofNullable(null);
      System.out.println(optOrNull); // 輸出:Optional.empty
      // 使用靜態方法empty()創建空的Optional實例
      Optional<String> empty = Optional.empty();
      

      boolean isPresent()

      ??isPresent() 用于判斷一個 Optional 對象是否存在值,如果存在,該方法返回 true;否則,返回 false。Java 11 后還可以通過方法 isEmpty() 判斷與 isPresent() 相反的結果。

      void ifPresent(Consumer<? super T> consumer)

      ??判斷是否存在值,如果值存在則使用函數式編程的方式執行 consumer;否則,不做任何事情。如果沒有該方法,需要先通過 isPresent() 方法對 Optional 對象進行判空再執行相應的代碼:

      Optional<String> opt = Optional.of("樓蘭胡楊");
      opt.ifPresent(str -> System.out.println(str.length()));
      

      T get()

      ??get方法用于獲取封裝在 Optional 對象中的、不為null的值;若沒有,則拋出NoSuchElementException

      T orElse(T other)

      ??orElse(T other) 方法用于獲取封裝在 Optional 對象中的、不等于null的值,如果調用的對象包含null值,則返回默認值other。

          public static void main(String[] args) {
              Integer num = null;
              Integer orElse = Optional.ofNullable(num).orElse(12);
              System.out.println("orElse null: " + orElse);
              num = 32;
              orElse = Optional.ofNullable(num).orElse(12);
              System.out.println("orElse 32: " + orElse);
          }
      

      執行結果:

      orElse null: 12
      orElse 32: 32
      

      T orElseGet(Supplier<? extends T> other)

      ??如果對象包含不為null的值,則返回該值;否則,使用函數式編程的方式觸發 other 函數,并返回 other 執行的結果。它與 orElse(T other) 方法類似,但參數類型不同。

        Optional<Employee> op = Optional.ofNullable(null);
        // 參數是函數式接口,可以寫自定義業務邏輯
        Employee emp = op.orElseGet(() -> new Employee());
      

      Optional filter(Predicate<? super predicate)

      ??Optional可以實現數據過濾,與Stream流過濾功能如出一轍,也是通過匿名內部類new Predicate實現。filter() 方法的參數類型為 Predicate,也就是說可以將一個 Lambda 表達式傳遞給該方法作為條件,如果值非空,則根據Predicate斷言條件檢查該值是否符合預期,若符合則返回包含此值的Optional對象,若不符合則返回一個EMPTY的Optional對象。

      public class OptionalMapFilterDemo {
          public static void main(String[] args) {
              String password = "password";
              Optional<String> opt = Optional.ofNullable(password);
      
              Predicate<String> len6 = pwd -> pwd.length() > 6;
              Predicate<String> len10 = pwd -> pwd.length() < 10;
              Predicate<String> eq = pwd -> pwd.equals("password");
      
              boolean result = opt.map(String::toLowerCase).filter(len6.and(len10 ).and(eq)).isPresent();
              System.out.println(result);
            // filter提供一個斷言,過濾Optional的值
              Optional<List<Integer>> integers = Optional.ofNullable(Arrays.asList(1, 2, 3, 4, 5)).filter(list -> list.size() > 5);
          }
        
          //過濾List中null的元素
          public <T> List<T> filterNullElem(Iterable<T> target) {
              return ofNullable(target).filter(Objects::nonNull).collect(Collectors.toList());
          }
      }
      

      ??filter 與orElse或者orElseGet聯合使用案例:

      // 如果filter函數返回的Optional值為null,那么返回orElse方法中的值
      String v1 = Optional.of("").filter(e -> e != null && e.length() > 0).orElse("default");
      System.out.println(v1);
      // orElseGet提供一個生成器,用于返回默認值
      String v2 = Optional.of("").filter(e -> e != null && e.length() > 0).orElseGet(() -> "123");
      System.out.println(v2);
      

      Optional<U> flatMap(Function<? super T, Optional<U>> mapper)

      ??如果值存在,返回映射方法mapper的值;否則,返回一個空的Optional。

      Optional<U> map(Function<? super T, ? extends U> mapper)

      ??就像stream流一樣,Optional也可以通過map的方式從Optional中取出元素,map方法返回的是一個Optional類型的對象,里面的值如果為null,可以使用orElse方法賦上自定義的默認值。

        Insurance insurance = new Insurance();
        insurance.setName("樓蘭胡楊");
        Optional<Insurance> optionalInsurance = Optional.ofNullable(insurance);
        String name = optionalInsurance.map(Insurance::getName).orElse("unKnown");
      

      ??如果有值,則對其執行映射函數mapper得到返回值。如果返回值不為 null,則創建包含映射返回值的Optional作為map方法返回值;否則,返回空Optional。

      T orElseThrow(Supplier<? extends X> exceptionSupplier)

      ??如果存在值,返回包含的值;否則,拋出由 exceptionSupplier 指定的異常:

          String v3 = Optional.of("").filter(e -> e != null && e.length() > 0).orElseThrow(RuntimeException::new);
      

      Reference

      posted @ 2023-07-29 21:13  樓蘭胡楊  閱讀(319)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美和黑人xxxx猛交视频| 豆国产97在线 | 亚洲| 日韩有码中文字幕av| 撩起胸让我的?蹭来蹭去| 成在线人永久免费视频播放 | 阿拉善左旗| 亚洲欧洲日产国码久在线| 制服丝袜长腿无码专区第一页| 中文字幕人妻中出制服诱惑| 92自拍视频爽啪在线观看| 欧美z0zo人禽交另类视频| 亚洲综合小综合中文字幕| 国产二区三区不卡免费| 欧美最猛性xxxxx大叫| 97久久精品人人做人人爽| 精品夜恋影院亚洲欧洲| 精品国产欧美一区二区三区在线| 亚洲精品视频免费| 日韩欧激情一区二区三区| 国产成人片无码视频在线观看| 国产精品日韩专区第一页| 制服 丝袜 亚洲 中文 综合| 象山县| 激情五月日韩中文字幕| 在线精品国产成人综合| 欧美又黄又大又爽a片三年片| 乱码中文字幕| 色综合色狠狠天天综合网| 动漫av网站免费观看| 日韩国产中文字幕精品| 亚洲国产欧美在线人成AAAA| 小雪被老外黑人撑破了视频| 黄色舔女人逼一区二区三区| 女人被狂躁c到高潮| 午夜精品一区二区三区成人| 精品国产中文字幕av| 亚洲AVAV天堂AV在线网阿V| 久久亚洲女同第一区综合| 337p粉嫩大胆噜噜噜| 中文字幕亚洲综合第一页| 亚洲嫩模一区二区三区|