日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

在JAVA開發中,空指針是程序員遇到的最多的異常之一(特別是剛接觸java開發的),對于對象中的某個屬性,有時候我們為了避免程序報空指針錯誤,而不得不使用較多的if、else來進行邏輯判斷,但這樣的話代碼可能就會比較冗余或者說不夠優雅。雖然我們大部分程序員是有責任心的,不會坐視不管,于是就有了大量的 null 值檢查。盡管有時候這種檢查完全沒有必要,但我們已經習慣了例行公事。終于Java 8 看不下去了,就引入了 Optional,以便我們編寫的代碼不再那么呆板。

NPE問題

NPE問題就是我們在開發中經常碰到的NullPointerException.假設我們有兩個類,他們的UML類圖如下圖所示:

Java空指針檢查實在看不下去了——轉用Optional真香

現在需要訪問用戶地址信息的省份,簡單代碼為:user.getAddress().getProvince();

在這種寫法中,當user為null時,是有可能報NPE異常的。為了解決這個問題,于是采用下面的寫法:

public String OptGetProvince(User user){
      if(user!=null){
          Address address = user.getAddress();
          if(address!=null){
              String province = address.getProvince();
              return province;
          }
          return "none";
      }
}

這種寫法是比較繁瑣的,為了避免上述丑陋的寫法。于是JAVA8提供了Optional類來優化這種寫法:

public String OptGetProvince(User user){
        return Optional.ofNullable(user)
                .map(s -> s.getAddress())
                .map(a -> a.getProvince())
                .orElse("none");
    }

可以看到,通過Optional的使用,可以很好的解決if以及嵌套判空的問題,使得整體的判斷變得清爽簡潔多了。

Optional使用

我們可以把Optional類看成是一個容器,我們將對象存儲到容器中后,通過調用內置的API,可以較為安全地過濾掉可能存在的空指針問題,避免繁瑣嵌套的if、else操作,讓我們的代碼盡可能的簡潔。API主要分5個大類。

Java空指針檢查實在看不下去了——轉用Optional真香

構造函數: empty,of,ofNullable

empty返回一個空的Optional對象。

Optional.empty();

of根據傳入的值生成Optional對象。

// 方式2 將非空對象作為屬性傳入Optional類中
User u = new User("小明",16);
 Optional.of(u.getAddress());

ofNullable 和of方法一樣,根據傳入的值生成optional對象。

// 方式3 將非空對象作為屬性傳入Optional類中
 User u = new User("小明",16);
 Optional.ofNullable(u.getAddress());

of和ofNullable的作用很相近,從Optional類的源代碼看的話,可以發現對于ofNullable方法的話是有進行判空的。也就是說,如果使用of方法傳入的參數是null,同樣會報空指針。

Java空指針檢查實在看不下去了——轉用Optional真香

值選擇方法:orElse,orElseGet和orElseThrow

這三個方法相當于SQL中的IFNULL函數,若Optional中值為null,則返回給定的默認值。

orElse

User s = new User("小明",16,new Address());
String result = Optional.ofNullable(s.getAddress().getProvince()).orElse("深圳");

orElseGet

User s = new User("小明",16,new Address());
String result = Optional.ofNullable(s.getAddress().getProvince()).orElseGet(()->"深圳");

orElseThrow

User s = new User("小明",16,new Address());
String s3 = Optional.ofNullable(s.getAddress().getProvince()).orElseThrow(() -> new IllegalArgumentException("缺少參數"));

對于orElseThrow和orElseGet兩個方法,是采用函數式接口的方式來作為參數的。同時,對于orElse和orElseGet兩個方法,作用相近,區別是若Optional對象中的值不為空,則orElseGet不會創建參數中的對象,而orElse無論什么情況都會創建參數對象。

判空函數:isPresent和ifPresent

兩個函數的用法類似,都可以用作判空,區別在于當不為空時,ifPresent會執行對應的函數。

isPresent

User user = new User("小明",16,new Address());
boolean b1 = Optional.ofNullable(user.getAddress()).isPresent();
System.out.println(b1);  // true

ifPresent

User user = new User("小明",16,new Address());
Optional.ofNullable(user.getAddress()).ifPresent(address -> System.out.println(address));

值轉換函數:map和flagMap

值轉換的就是對Optional對象中的value值進行轉換,對值應用(調用)作為參數的函數,然后將返回的值包裝在 Optional中

map

User user = new User("小明",16,new Address());
String s1 = Optional.ofNullable(user).map(s -> s.getName()).get();

flagMap

User user = new User("小明",16,new Address());
String s1 = Optional.ofNullable(user).flatMap(s -> s.getName()).get();

兩個函數都可以實現值的轉換,兩者的區別是二者的入參不同。以上面的flagMap的示例代碼為例,我們需要在User類中重寫一下getName方法,使其返回Optional對象。

過濾(篩選)函數:filter

該函數的作用是,判斷Optional中的值是否滿足指定條件,若滿足則返回,否則返回一個EMPTY對象。

User user = new User("小明",16,new Address());
User result = Optional.ofNullable(user).filter(s -> s.getName().equals("小紅")).orElseGet(() ->new User("小藍",10));
System.out.println(result); // user{address=null, name='小藍', age=10}

這里會篩選出滿足姓名為小紅的User對象,若不滿足則新建一個姓名為小藍的User對象。

最后

需要注意,使用Optonal這種鏈式編程雖然簡潔化了程序代碼,但是邏輯性不是很明顯,相對來說會損失一定的代碼可讀性,具體的使用需要開發人員在實際場景中進行權衡。個人建議哪怕是自己不經常使用也要盡量掌握,避免出現閱讀源碼的時候顯得尷尬。

分享到:
標簽:Java
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定