欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8新特性O(shè)ptional常用方法

 更新時間:2024年02月04日 10:57:52   作者:Mine4everYoung  
optional類是Java8新增加的一個對象容器,主要的功能有對象的創(chuàng)建、獲取、判斷、過濾,映射等,下面這篇文章主要給大家介紹了關(guān)于Java8新特性O(shè)ptional常用方法的相關(guān)資料,需要的朋友可以參考下

前言

optional 是Java8 util包中的類,我們?yōu)榱吮苊饪罩羔槷惓?NullPointerException),經(jīng)常要寫好多類似if(a!=null){...},optional就是為了解決這些問題,讓代碼看起來更nb。

(一)Optional.ofNullable(e).ifPresent()

此方法是當(dāng)傳入的對象為不為空(e!=null)時,才會執(zhí)行ifPresent()中的代碼,e==null時什么都不會執(zhí)行,也不會拋異常。

//空對象 不會執(zhí)行
Optional.ofNullable(null).ifPresent(e -> {
    System.out.println("空");
});
//空字符串時會執(zhí)行 
Optional.ofNullable("").ifPresent(e -> {
    System.out.println("空字符串");
});
//空格 也會執(zhí)行
Optional.ofNullable(" ").ifPresent(e -> {
   System.out.println("空格");
});

輸出:

空字符串
空格 

(二)Optional.ofNullable(e).orElse()

orElse()方法,當(dāng) Optional 中有值則將其返回,為空時返回 orElse 方法傳入的參數(shù)。

此方法可以替代三目運算符使用。

//為空時返回orElse中的值
System.out.println(Optional.ofNullable(null).orElse("默認值"));
//輸出 默認值

//不為空時
System.out.println(Optional.ofNullable("我不是空").orElse("默認值"));
//輸出 我不是空

(三)Optional.ofNullable(e).orElseGet()

orElseGet方法,當(dāng)Optional 中值為空時,orElseGet與orElse效果是一樣的。當(dāng)Optional 中有值時,兩者才有區(qū)別,上代碼。

//當(dāng)參數(shù)為空時
String a = (String) Optional.ofNullable(null).orElse(get("a"));
System.out.println("a="+a);
String b = (String) Optional.ofNullable(null).orElseGet(() -> get("b"));
System.out.println("b="+b);

輸出
a:我執(zhí)行了
a=a
b:我執(zhí)行了
b=b

//參數(shù)不為空是
String c = Optional.ofNullable("notnull").orElse(get("c"));
System.out.println("c="+c);
String d =  Optional.ofNullable("我不是空").orElseGet(() -> get("d"));
System.out.println("d="+d);

輸出

c:我執(zhí)行了
c=notnull
(此處沒有 執(zhí)行)
d=我不是空

private static String get(String s) {
       System.out.println(s + ":我執(zhí)行了");
        return s;
 }

可以看到,當(dāng)參數(shù)不為空時,orElseGet中的方法是沒有執(zhí)行的。

(四)Optional.ofNullable(e).filter()

filter個方法通過傳入的定條件對Optional實例的值進行過濾,它可以配合著.ifPresent()方法和.orElse()使用

Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).ifPresent(t2 -> System.out.println("成立時我才會執(zhí)行"));

輸出
成立時我才會執(zhí)行

String a=Optional.ofNullable("notnull").filter(t -> "null".equals(t)).orElse(("不成立時我才會執(zhí)行"));
System.out.println("a="+a);

String b=Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).orElse(("不成立時我才會執(zhí)行"));
System.out.println("b="+b);

輸出
a=不成立時我才會執(zhí)行
b=notnull

補充:Optional的用法代碼案例

示例1:

String s = Optional.ofNullable(user)
                   .map(o -> o.getUsername())
                   .orElseGet(() -> { return "李四";});

用法說明:Optional.ofNullable(user)是判斷user是否為null,如果為null,則不會執(zhí)行map(o -> o.getUsername()),直接執(zhí)行orElseGet(() -> { return “李四”;})方法。如果不為null,則只執(zhí)行map(o -> o.getName())方法。
還有一個跟orElseGet()類似的方法:orElse(),orElse()方法不管ofNullable()值是否為null,都會執(zhí)行orElse()的代碼,而orElseGet()方法只有在ofNullable()值為null時才會執(zhí)行傳入的函數(shù)。

示例2:

有如下代碼,需要獲得Test2中的Info信息,但是參數(shù)為Test4,我們要一層層的申請,每一層都獲得的對象都可能是空,最后的代碼看起來就像這樣。

 public String testSimple(Test4 test) {
    if (test == null) {
       return "";
    }
    if (test.getTest3() == null) {
       return "";
    }
    if (test.getTest3().getTest2() == null) {
       return "";
    }
    if (test.getTest3().getTest2().getInfo() == null) {
       return "";
    }
    return test.getTest3().getTest2().getInfo();
}

但是使用Optional后,整個就都不一樣了。

    public String testOptional(Test test) {
       return Optional.ofNullable(test)
           .flatMap(Test::getTest3)
           .flatMap(Test3::getTest2)
           .map(Test2::getInfo)
           .orElse("");
    }

示例3:

Optional.ofNullable(user).ifPresent(o -> o.setUsername("李四"));

如果user不為null,執(zhí)行ifPresent()方法,否則不執(zhí)行ifPresent()方法,這與orElseGet()用法剛好相反。

示例4:

.查詢用戶信息,如果沒有則新建用戶,并將新建的用戶信息返回

    User user = Optional.ofNullable(
        baseMapper.selectOne(
            new QueryWrapper<User>()
                .lambda()
                .eq(User::getAlipayUserId, result.getUserId())
                .eq(User::getDelFlag, false)
    )).orElseGet(()-> {
      User newUser = User.builder()
          .relation(User.Relation.Unrelated)
          .authentication(false)
          .status(User.Status.Normal)
          .updateUserId(User.DEFAULT_USER_ID)
          .createUserId(User.DEFAULT_USER_ID)
          .roles(User.ROLE_USER_INFO)
          .alipayUserId(alipayUserId)
          .build();
      this.save(newUser);
      return newUser;
    });

示:5:

Optional.ofNullable(
        baseMapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getMobileNumber, phone))
    ).filter(user -> {
      if (StringUtils.isNotBlank(user.getAlipayUserId()) && user.getAlipayUserId().equals(userId)) {
        return true;
      }
      baseMapper.physicalDeleteByUserId(userId);
      baseMapper.update(new User(),
          new UpdateWrapper<User>().lambda()
              .set(User::getAlipayUserId, userId)
              .set(User::getUpdateTime, LocalDateTime.now())
              .eq(User::getMobileNumber, phone));
      return true;
    }).orElseGet(() -> {
      baseMapper.update(new User(),
          new UpdateWrapper<User>().lambda()
              .set(User::getMobileNumber, phone)
              .set(User::getUpdateTime, LocalDateTime.now())
              .eq(User::getAlipayUserId, userId));
      return null;
});

filter()方法的用法:只有Optional.ofNullable()不為空時,才會執(zhí)行filter()方法,否則會直接執(zhí)行orElseGet()方法。當(dāng)執(zhí)行filter()方法時,如果方法內(nèi)返回true,則直接將Optional.ofNullable()的對象返回,如果方法內(nèi)返回false,則繼續(xù)執(zhí)行orElseGet()方法。

總結(jié) 

到此這篇關(guān)于Java8新特性O(shè)ptional常用方法的文章就介紹到這了,更多相關(guān)Optional常用方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java身份證合法性校驗并提取身份證有效信息

    java身份證合法性校驗并提取身份證有效信息

    這篇文章主要為大家詳細介紹了java身份證合法性校驗,并獲取并根據(jù)身份證號提取身份證相關(guān)信息,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • java 實現(xiàn)下壓棧的操作(能動態(tài)調(diào)整數(shù)組大小)

    java 實現(xiàn)下壓棧的操作(能動態(tài)調(diào)整數(shù)組大小)

    這篇文章主要介紹了java 實現(xiàn)下壓棧的操作(能動態(tài)調(diào)整數(shù)組大小),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • springboot2.0整合logback日志的詳細代碼

    springboot2.0整合logback日志的詳細代碼

    這篇文章主要介紹了springboot2.0整合logback日志的應(yīng)用場景分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)

    logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)

    在使用logback作為日志框架時,可以創(chuàng)建一個名為logback-spring.xml的配置文件來自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關(guān)于logback-spring.xml的配置及示例詳解的相關(guān)資料,文中的代碼直接復(fù)制粘貼可用,需要的朋友可以參考下
    2024-01-01
  • Maven的安裝+配置本地倉庫路徑方式

    Maven的安裝+配置本地倉庫路徑方式

    這篇文章主要介紹了Maven的安裝+配置本地倉庫路徑方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Windows系統(tǒng)下如何查找JDK的安裝路徑

    Windows系統(tǒng)下如何查找JDK的安裝路徑

    這篇文章主要介紹了Windows系統(tǒng)下如何查找JDK的安裝路徑,文中介紹了三種方法,分別是通過命令行檢查、使用verbose選項查找jre目錄、以及查看環(huán)境變量,需要的朋友可以參考下
    2025-03-03
  • Java中的線程安全及其實現(xiàn)方式

    Java中的線程安全及其實現(xiàn)方式

    在多線程編程中,線程安全是一個非常重要的概念,線程安全指的是當(dāng)多個線程同時訪問某個共享資源時,程序的行為仍然是正確的,不會出現(xiàn)數(shù)據(jù)不一致或其他不可預(yù)見的錯誤,本文將詳細介紹什么是線程安全,以及如何在Java中實現(xiàn)線程安全,需要的朋友可以參考下
    2025-02-02
  • 關(guān)于Dubbo初始問題

    關(guān)于Dubbo初始問題

    這篇文章主要介紹了關(guān)于Dubbo初始問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Maven倉庫加載順序的實例解析

    Maven倉庫加載順序的實例解析

    Maven倉庫一般分為本地倉庫和遠程倉庫。那么在實際開發(fā)中,在配置了多個倉庫的情況下,他們之間的加載訪問順序是怎么樣的呢,本文就詳細的來介紹一下
    2021-12-12
  • Java的延遲隊列之DelayQueue解讀

    Java的延遲隊列之DelayQueue解讀

    這篇文章主要介紹了Java的延遲隊列之DelayQueue解讀,DelayQueue的底層存儲是一個PriorityQueue,PriorityQueue是一個可排序的Queue,其中的元素必須實現(xiàn)Comparable接口的compareTo方法,需要的朋友可以參考下
    2023-12-12

最新評論