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

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

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

服務器之家 - 編程語言 - Java教程 - Java關于JDK1.8中的Optional類

Java關于JDK1.8中的Optional類

2021-12-18 13:31碼農(nóng)飛哥 Java教程

本文主要介紹了Optional類的一些常用方法,以及其應用場景,其主要是為了規(guī)避空指針異常(NPE)。熟練的運用Optional類可以很大的簡化我們的代碼,使代碼簡潔明了。,需要的朋友可以參考下面文章內(nèi)容

Java關于JDK1.8中的Optional類

一、定義

Optional是一個容器,它可以保存類型T的值,或者僅僅保存null,Optional類主要是用來避免空指針異常(NPE),其提供的一系列的方法配合Lambda表達式可以讓代碼更加清晰,語義化,以及避免了空指針異常的問題,這里要注意是避免空指針異常,而不是避免返回null。

二、Optional方法的使用

1、empty 方法

empty 方法返回一個不包含值的Optional實例,注意不保證返回的empty是單例,不要用==比較。

public static<T> Optional<T> empty()

2、of 方法返

of 方法返回一個Optional實例,傳入的值必須是非空值,傳入null會拋出空指針異常。

public static <T> Optional<T> of(T value)

3、返回一個Optional實例

如果傳入值非空,則實例中包含非空值,如果傳入null,返回不包含值的empty

public static <T> Optional<T> ofNullable(T value)

4、isPresent 方法

用來判斷實例是否包含值,如果不包含非空值返回false,否則返回true

public boolean isPresent();

5、get方法

如果實例包含值則返回當前值,否則拋出NoSushElementException 異常.

public T get();

不推薦調(diào)用上面兩個方法,因為容易寫出如下代碼,比原先判斷if null的代碼還要臟

?
1
2
3
4
5
6
7
public static String getUserName1(User user) {
     Optional<User> user1 = Optional.ofNullable(user);
     if (!user1.isPresent()) {
         return "參數(shù)為空";
     }
     return user1.get().getName();
 }

下面是用if-null

?
1
2
3
4
5
6
public static String getUserName(User user) {
      if (user == null) {
          return "參數(shù)為空";
      }
      return user.getName();
  }

6、ifPresent

(Consumer consumer):如果option對象保存的值不是null,則調(diào)用consumer對象,否則不調(diào)用

 public void ifPresent(Consumer<? super T> consumer);

代碼示例:

?
1
2
3
4
5
6
Optional<Integer> optional1 = Optional.ofNullable(1);
     Optional<Object> optional2 = Optional.ofNullable(null);
  //如果不是null,調(diào)用Consumer
     optional1.ifPresent(t -> System.out.println("value is" + t));   //value is1
     //如果是null,不調(diào)用Consumer
     optional2.ifPresent(t -> System.out.println("value is " + t));  

如上代碼,輸出結果是 第一條 語句輸出value is1,第二條語句沒有輸出

 7、filter方法

 如果值存在,并且這個值匹配給定的predicate,返回一個Optional用以描述這個值,否則返回一個空的Optional

Optional<T> filter(Predicate<? super <T> predicate)

代碼示例:

?
1
2
3
4
5
6
7
8
9
Optional<Integer> optional1 = Optional.ofNullable(1);
     Optional<Object> optional2 = Optional.ofNullable(null);
     Optional<Integer> filter1 = optional1.filter(a -> a == null);
      Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
      Optional<Object> 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

如上代碼,演示了filter方法如何使用,輸出結果如代碼注釋所示。

8、 map(Function)

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

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

代碼示例:輸出結果已經(jīng)寫在注釋中。

?
1
2
3
4
5
6
Optional<Integer> optional1 = Optional.ofNullable(1);
      Optional<Object> 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

9、flatMap()

功能與map()相似,差別在返回值不同,flatMap方法的mapping函數(shù)返回值可以是任何類型T,而map方法的mapping函數(shù)必須是Optional

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

代碼示例:

?
1
2
3
4
5
6
Optional<Integer> optional1 = Optional.ofNullable(1);
      Optional<Object> optional2 = Optional.ofNullable(null);
     Optional<Optional<String>> str11Optional = optional1.map(a -> Optional.of("key" + a));
      Optional<String> str22Optional = optional1.flatMap(a -> Optional.of("key" + a));
      System.out.println(str11Optional.get().get()); //key1
      System.out.println(str22Optional.get()); //key1

10、orElse方法

如果optional對象保存的值不是null,則返回原來的值,否則返回value。

public T orElse(T other);

代碼示例:

?
1
2
3
4
    Optional<Integer> optional1 = Optional.ofNullable(1);
    Optional<Object> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElse(1000) == 1); //true
    System.out.println((Integer) optional2.orElse(1000) == 1000);//true

11、orElseGet(Supplier supplier)

功能與orElse一樣,只不過orElseGet參數(shù)是一個對象。
 

public T orElseGet(Supplier<? extends T> other);

代碼示例:

?
1
2
3
4
    Optional<Integer> optional1 = Optional.ofNullable(1);
     Optional<Object> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElseGet(() -> 1000) == 1); //true
     System.out.println((Integer) optional2.orElseGet(() -> 1000) == 1000); //true

12、orElseThrow方法

值不存在則調(diào)用傳入的Supplier參數(shù),生成一個異常實例并拋出,這個方法通常與全局異常處理器一起使用,當參數(shù)或者其他情況獲取不到值是,拋出自定義異常,由異常處理器處理成通用返回結果。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier);

代碼示例:

?
1
2
3
4
5
6
7
8
9
10
optional1.orElseThrow(() -> {
     throw new IllegalStateException();
 });
 try {
     optional2.orElseThrow(() -> {
         throw new IllegalStateException();
     });
 } catch (IllegalStateException e) {
     e.printStackTrace();
 }

三、實戰(zhàn)參考

假設我們要解析一段json字符串,按照傳統(tǒng)的if-null方式我們需要做如下處理:為了獲取CUid的值,我們必須要判斷三次。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public static String getOrgUid(String orgResult) {
       if (StringUtils.isBlank(orgResult)) {
           return null;
       }
       JSONObject jsonObject = JSON.parseObject(orgResult);
       if (jsonObject == null) {
           return null;
       }
       if ("success".equals(jsonObject.getString("result"))) {
           return jsonObject.getString("CUid");
       }
       return null;
   }

而運用了我們的Optional類之后,我們可以通過函數(shù)式變成來實現(xiàn)。

?
1
2
3
4
5
6
7
8
9
10
11
public static String getNewUid(String orgResult) {
       String orElse = Optional.ofNullable(orgResult)
               .map(n -> JSONObject.parseObject(n))
               .map(a -> {
                   if ("success".equals(a.getString("result"))) {
                       return a.getString("CUid");
                   }
                   return null;
               }).orElse(null);
       return orElse;
   }

運用了函數(shù)式變成,我們只需要三段3段代碼就能輕松的駕馭,代碼簡潔明了。

到此這篇關于Java關于JDK1.8中的Optional類的文章就介紹到這了,更多相關Java的Optional類內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://feige.blog.csdn.net/article/details/104385258

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
主站蜘蛛池模板: 国产精品久久久久久久牛牛 | 9966久久精品免费看国产 | 亚州成人 | 色中色导航 | 91青青在线视频 | 日本孕妇与黑人xxxxxx | 国产成人99久久亚洲综合精品 | 9l国产精品久久久久麻豆 | 成人在线播放 | 天堂俺去俺来也www久久婷婷 | 好舒服好爽再快点视频 | 调教老师肉色丝袜的故事 | 国产精品久久久久网站 | 色狠狠成人综合网 | 91精品免费国产高清在线 | 免费永久观看美女视频网站网址 | 欧美视频一区二区专区 | 色综合天天综合网看在线影院 | 欧美成人免费草草影院视频 | 免费视频网 | bbc japanese黑人强行 | 亚洲 色 欧美 爱 视频 日韩 | 狠狠草视频| 每天都要睡男人(nph) | 免费被靠视频动漫 | 把美女屁股眼扒开图片 | 国产在线98福利播放视频免费 | 变形金刚第一部 | 九色PORNY真实丨国产免费 | 互换身体全集免费观看 | 国产专区视频在线观看 | 日韩毛片免费在线观看 | 91传媒制片厂果冻有限公司 | 好涨好爽好大视频免费 | 调教小龙女 | 精品国产一级在线观看 | 久久久久久久久a免费 | 国产精品高清在线 | 久久无码人妻中文国产 | 北岛玲亚洲一区在线观看 | 69成人网 |