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

Java8 Optional判空詳解(簡化判空操作)

 更新時間:2021年05月10日 14:55:53   作者:MengW9  
這篇文章主要給大家介紹了關于Java8 Optional判空(簡化判空操作)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、導語

在沒有用Optional判空之前,你是否也像下面的代碼一樣判空呢?如果是,請往下看,Optional 相對傳統(tǒng)判空的優(yōu)勢。

傳統(tǒng)階層判空

為什么要用Optional,它到底是什么東西

你也看到了上面的那張圖,一旦代碼量大起來了,條件多了,代碼就會變得很冗余,變得難以維護。那么此時我們就有必要了解Optional了。

Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。Optional 類的引入很好的解決空指針異常。

二、Optional使用

Optional 的方法,如下圖

Optional方法-圖1

Optional方法-圖2

方法就是這么多,其他的也不必多說,相信各位小伙伴一看就懂;如何使用,還是用代碼演示,請往下移步。

三、Optional實例

1.of

為非null的值創(chuàng)建一個Optional。of方法通過工廠方法創(chuàng)建Optional類。需要注意的是,創(chuàng)建對象時傳入的參數(shù)不能為null。如果傳入?yún)?shù)為null,則拋出NullPointerException 。

Optional<String> optional = Optional.of("xiaoming");
//傳入null,拋出NullPointerException
Optional<Object> o = Optional.of(null);

2.ofNullable

為指定的值創(chuàng)建一個Optional,如果指定的值為null,則返回一個空的Optional。

Optional<Object> o1 = Optional.ofNullable(null);

3.isPresent

值存在返回true,否則返回false

Optional<String> optiona2 = Optional.of("xiaoming");
System.out.println(optiona2.isPresent());

4.get

Optional有值就返回,沒有拋出NoSuchElementException

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.get());

5.ifPresent

如果Optional有值則調用consumer處理,否則不處理

Optional<Object> o1 = Optional.ofNullable(null);
 o1.ifPresent(s -> System.out.println(s));

6.orElse

如果有值則將其返回,否則返回指定的其它值

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElse("輸出orElse")); // 輸出orElse

7.orElseGet

orElseGet與orElse方法類似,區(qū)別在于得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier接口的實現(xiàn)用來生成默認值

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElseGet(() -> "default value")); // default value

*注意:orElse 和 orElseGet 看似差不多,其實有很大不同;看下面例子

Shop shop = null;
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//createNew
private static Shop createNew() {  System.out.println("create new");
  return new Shop("尺子", 50);
}//輸出:
test orElsecreate newtest orElseGetcreate new
Shop shop = new Shop("鋼筆",100);
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//輸出
test orElsecreate newtest orElseGet

從上面兩個例子可以看到,當Optional 為空時,orElse和orElseGet 區(qū)別不大,但當Optional有值時,orElse仍然會去調用方法創(chuàng)建對象,而orElseGet不會再調用方法;在我們處理的業(yè)務數(shù)據(jù)量大的時候,這兩者的性能就有很大的差異。

8.orElseThrow

如果有值則將其返回,否則拋出supplier接口創(chuàng)建的異常。

Optional<Object> o1 = Optional.ofNullable(null);
try {
  o1.orElseThrow(() -> new Exception("異常!"));
} catch (Exception e) {
  System.out.println("info:" + e.getMessage());
}//輸出:info:異常!

9.map

如果有值,則對其執(zhí)行調用mapping函數(shù)得到返回值。如果返回值不為null,則創(chuàng)建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。

Optional<String> optional = Optional.of("xiaoming");
String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
System.out.println(s); //輸出: XIAOMING

10.flatMap

如果有值,為其執(zhí)行mapping函數(shù)返回Optional類型返回值,否則返回空Optional。與map不同的是,flatMap 的返回值必須是Optional,而map的返回值可以是任意的類型T

Optional<String> optional = Optional.of("xiaoming");
Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase()));
System.out.println(s.get()); //輸出:XIAOMING

11.filter

List<String> strings = Arrays.asList("rmb", "doller", "ou");
for (String s : strings) {
  Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o"));
  System.out.println(o.orElse("沒有不包含o的"));
}//輸出:
rmb
沒有不包含o的
沒有不包含o的

四、小結

Optional 是java非常有用的一個補充,它旨在減少代碼中的NullPointerExceptions,雖然不能百分之百的消除,但也是精心設計的。使用Optional 能更好的幫助我們創(chuàng)建可讀性強,bug更少的應用程序。

總結

到此這篇關于Java8 Optional判空(簡化判空操作)的文章就介紹到這了,更多相關Java8 Optional判空內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring MVC請求參數(shù)與響應結果全局加密和解密詳解

    Spring MVC請求參數(shù)與響應結果全局加密和解密詳解

    這篇文章主要給大家介紹了關于Spring MVC請求參數(shù)與響應結果全局加密和解密的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • 基于Java的Scoket編程

    基于Java的Scoket編程

    本文詳細講解了基于Java的Scoket編程,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • springmvc九大組件之HandlerAdapter詳解

    springmvc九大組件之HandlerAdapter詳解

    這篇文章主要介紹了springmvc九大組件之HandlerAdapter詳解,RequestMappingHandlerAdapter支持的handler的類型是HandlerMethod,而HandlerMethod是通過解析@RequestMapping注解獲得的,需要的朋友可以參考下
    2023-11-11
  • 詳解JVM基礎之字節(jié)碼的增強技術

    詳解JVM基礎之字節(jié)碼的增強技術

    字節(jié)碼增強技術就是一類對現(xiàn)有字節(jié)碼進行修改或者動態(tài)生成全新字節(jié)碼文件的技術。接下來,我們將從最直接操縱字節(jié)碼的實現(xiàn)方式開始深入進行剖析,感興趣的可以了解一下
    2022-10-10
  • SpringData JPA 如何搭建 xml的配置方式

    SpringData JPA 如何搭建 xml的配置方式

    這篇文章主要介紹了SpringData JPA 如何搭建 xml的配置方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Java高效提取PDF文件指定坐標的文本內容實戰(zhàn)代碼

    Java高效提取PDF文件指定坐標的文本內容實戰(zhàn)代碼

    在日常工作中,有時可能會需要從龐大的PDF文檔中提取其中所包含的文本內容,下面這篇文章主要給大家介紹了關于如何利用Java高效提取PDF文件指定坐標的文本內容,需要的朋友可以參考下
    2024-01-01
  • SpringBoot+OCR?實現(xiàn)圖片文字識別

    SpringBoot+OCR?實現(xiàn)圖片文字識別

    本文主要介紹了SpringBoot+OCR 實現(xiàn)圖片文字識別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 常用Eclipse快捷方式(推薦)

    常用Eclipse快捷方式(推薦)

    下面小編就為大家?guī)硪黄S肊clipse快捷方式(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Java使用5個線程計算數(shù)組之和

    Java使用5個線程計算數(shù)組之和

    本文主要介紹了Java使用5個線程計算數(shù)組之和,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • IDEA打開項目所有東西都在報紅報錯的解決方案

    IDEA打開項目所有東西都在報紅報錯的解決方案

    這篇文章主要給大家介紹了關于IDEA打開項目所有東西都在報紅報錯的三個解決方案,文中通過圖文介紹的非常詳細,對大家學習或者使用idea具有一定的參考學習價值,需要的朋友可以參考下
    2023-06-06

最新評論