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

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

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
主站蜘蛛池模板: 三级黄色片在线免费观看 | 邪恶肉肉全彩色无遮盖 | 精品久久亚洲 | 三级午夜宅宅伦不卡在线 | 青草悠悠视频在线观看 | 亚洲2017久无码 | 九九精品影院 | 99re最新网址 | 国产精品视频久久久 | 亚洲成人福利网站 | 久久久久久久久女黄9999 | 欧美日韩视频在线第一区二区三区 | 射逼视频| 色综合九九 | 亚洲国产视频一区 | 美女扒开胸罩露出胸大乳 | 欧美专区综合 | 国产一区二区在线观看视频 | 国产一级特黄aa大片在线 | 农村妇女野战bbxxx农村妇女 | 扒开双腿疯狂进出爽爽动态图 | 免费xxxxx大片在线观看影视 | 亚洲成在人线视频 | 亚洲电影成人 成人影院 | 欧美日韩一二三区免费视频观看 | 青山葵在线 | 513热点网深夜影院影院诶 | 麻豆视频网 | 欧美肥胖老妇做爰变态 | 极品蜜桃臀美女啪啪 | 久久AV国产麻豆HD真实乱 | 日本中文字幕在线视频 | 99久久免费视频 | 99爱在线| 极品蜜桃臀美女啪啪 | 40分钟在线观看免费 | 久久re亚洲在线视频 | 国产小视频在线免费观看 | 亚洲精品久久久992KVTV | 精品国语国产在线对白 | 香蕉精品 |