一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java8 Optional原理及用法解析

Java8 Optional原理及用法解析

2020-09-02 00:34三月凌空 Java教程

這篇文章主要介紹了Java8 Optional原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

平時開發的工作中, 自己組內的很多大佬經常使用Optional的用法, 自己問他們, 這個到底有什么好處呢,他們說可以很好的規避好空指針的問題, 我們在平時寫java代碼的時候, 如果是一個新手, 肯定很多情況下都會出現空指針的報錯, 而java8 以后提供的Optional的問題, 就可以很好地規避我們空指針的問題.

空指針異常是導致Java應用程序失敗的最常見原因。以前,為了解決空指針異常,Google公司著名的Guava項目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵程序員寫更干凈的代碼。受到Google Guava的啟發,Optional類已經成為Java 8類庫的一部分。Optional實際上是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。

1. 在Optional之前

在Java 8之前,程序員將返回null而不是Optional。這種方法有一些缺點。一種是沒有明確的方法來表示null可能是一個特殊值。相比之下,在API中返回Optional是明確的聲明,其中可能沒有值。如果我們要確保不會出現空指針異常,則需要對每個引用進行顯式的空檢查,如下所示,我們都同意這是很多樣板。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Life before Optional
  private void getIsoCode( User user){
    if (user != null) {
      Address address = user.getAddress();
      if (address != null) {
        Country country = address.getCountry();
        if (country != null) {
          String isocode = country.getIsocode();
          if (isocode != null) {
            isocode = isocode.toUpperCase();
         }
       }
     }
   }
 }

為了簡化此過程,讓我們看一下如何使用Optional類,從創建和驗證實例到使用它提供的不同方法并將其與返回相同類型的其他方法組合在一起,后者才是Optional的厲害之處。

Optional類提供了大約10種方法,我們可以使用它們來創建和使用Optional類,下面將介紹如何使用它們。

2. 創建一個Optional類

1. Optional.of()

// 參數不能是null
Optional<Integer> optional1 = Optional.of(1);

2. Optional.ofNullable()

Optional.of()或者Optional.ofNullable():創建Optional對象,差別在于of不允許參數是null,而ofNullable則無限制。

// 參數可以是null
Optional<Integer> optional2 = Optional.ofNullable(null);

// 參數可以是非null
Optional<Integer> optional3 = Optional.ofNullable(2);

3. Optional.empty()

Optional.empty():所有null包裝成的Optional對象:

Optional<Integer> o1 = Optional.<Integer>empty()
Optional<Integer> o2 = Optional.ofNullable(null)
print(o1 == o2) // true

3. 判斷是否存在

1. isPresent()判斷值是否存在

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);

// isPresent判斷值是否存在
System.out.println(optional1.isPresent() == true);
System.out.println(optional2.isPresent() == false);

2. ifPresent(Consumer consumer)

ifPresent(Consumer consumer), 如果Optional對象保存的值不是null, 則調用consumer對象,否則不調用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
 
// 如果不是null,調用Consumer
optional1.ifPresent(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println("value is " + t);
}
});
 
// null,不調用Consumer
optional2.ifPresent(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println("value is " + t);
}
});

5. 獲取Optional里面的對象

1. get()

注意:在調用get()方法之前, 一定要先進行isPresent()方法判斷是否存在值

?
1
2
3
4
5
//get
Optional<String> optional1 = Optional.of("javaone");
if (optional1.isPresent()){
 String value = optional1.get();
}

2. orElse(value)

返回值(如果存在);反之,返回其他。

//orElse
String nullName = null;
String name = Optional.ofNullable(nullName).orElse("default_name");

3. orElseGet(Supplier supplier)

返回值(如果存在);否則,調用other并返回該調用的結果。

該orElseGet() 方法類似于 orElse()。但是,如果沒有Optional值,則不采用返回值,而是采用供應商功能接口,該接口將被調用并返回調用的值:

//orElseGet
String name = Optional.ofNullable(nullName).orElseGet(() -> "john");

那么,orElse() 和orElseGet()之間有什么區別。

乍一看,這兩種方法似乎具有相同的效果。但是,事實并非如此。讓我們創建一些示例,以突出兩者之間的相似性和行為差異。

首先,讓我們看看它們在對象為空時的行為:

?
1
2
3
4
5
6
7
String text = null;
String defaultText = Optional.ofNullable(text).orElseGet(this::getDefaultValue);
defaultText = Optional.ofNullable(text).orElse(getDefaultValue());
public String getDefaultValue() {
  System.out.println("Getting Default Value");
  return "Default Value";
}

在上面的示例中,我們在Optional對象中包裝了一個空文本,然后嘗試使用兩種方法中的每一種來獲取包裝后的值。副作用如下:

Getting Default Value
Getting Default Value

在每種情況下都會調用默認方法。碰巧的是,當不存在包裝的值時,兩者 orElse() 和的 orElseGet() 工作方式完全相同。

4. orElseThrow()

值不存在則拋出異常,存在則什么不做,有點類似Guava的Precoditions

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
 
optional1.orElseThrow(()->{throw new IllegalStateException();});
 
try
{
// 拋出異常
optional2.orElseThrow(()->{throw new IllegalStateException();});
}
catch(IllegalStateException e )
{
e.printStackTrace();
}

5. 流處理

1. filter(Predicate)

判斷Optional對象中保存的值是否滿足Predicate,并返回新的Optional。

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);

Optional<Integer> filter1 = optional1.filter((a) -> a == null);
Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
Optional<Integer> filter3 = optional2.filter((a) -> a == null);
System.out.println(filter1.isPresent());// false
System.out.println(filter2.isPresent());// true
System.out.println(filter2.get().intValue() == 1);// true
System.out.println(filter3.isPresent());// false

2. map(Function):

對Optional中保存的值進行函數運算,并返回新的Optional(可以是任何類型)

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);

Optional<String> str1Optional = optional1.map((a) -> "key" + a);
Optional<String> str2Optional = optional2.map((a) -> "key" + a);

System.out.println(str1Optional.get());// key1
System.out.println(str2Optional.isPresent());// false

3. flatMap()

功能與map()相似,差別請看如下代碼。flatMap方法與map方法類似,區別在于mapping函數的返回值不同。map方法的mapping函數返回值可以是任何類型T,而flatMap方法的mapping函數必須是Optional。

Optional<Integer> optional1 = Optional.ofNullable(1);

Optional<Optional<String>> str1Optional = optional1.map((a) -> {
return Optional.<String>of("key" + a);
});

Optional<String> str2Optional = optional1.flatMap((a) -> {
return Optional.<String>of("key" + a);
});

System.out.println(str1Optional.get().get());// key1
System.out.println(str2Optional.get());// key1

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.51cto.com/14901322/2521151

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: miaa076深田咏美在线 | jzzjlzz亚洲乱熟在线播放 | 久久婷婷五月免费综合色啪 | 黑人同学征服教师麻麻 | 色综合伊人色综合网亚洲欧洲 | ady成人映画网站官网 | brazzersvideo欧美最新 | 99re8在这里只有精品23 | 久久精品国产亚洲AV麻豆欧美玲 | 97午夜视频 | 日韩欧美一区二区三区免费观看 | 男人的天堂在线观看视频不卡 | 日韩 国产 欧美 精品 在线 | 武侠古典久久亚洲精品 | 国产视频三区 | 日本 片 成人 在线 日b视频免费 | 91寡妇天天综合久久影院 | 鬼惨笑小说| 456亚洲老头视频 | 日本色淫| 国产成人精品高清不卡在线 | 国内自拍视频在线观看 | 四虎影视紧急入口地址大全 | 98色花堂永久地址国产精品 | 亚洲精品色婷婷在线影院麻豆 | 国产精品免费一级在线观看 | 视频在线观看一区二区 | 日韩综合久久 | 午夜国产精品福利在线观看 | poren黑人 | 久久永久视频 | 美女乳液 | 91麻豆国产 | 99久久综合九九亚洲 | 亚洲首页国产精品丝袜 | 成人精品在线 | 女教师巨大乳孔中文字幕免费 | 日本狠狠操 | 亚洲男人天堂av | 国产在线精品香蕉综合网一区 | 久久精品动漫99精品动漫 |