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

Java8的Optional如何干掉空指針(示例詳解)

 更新時(shí)間:2021年01月04日 08:55:04   作者:天喬巴夏丶  
這篇文章主要介紹了Java8的Optional如何干掉空指針,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Optional概述

Optional 是個(gè)容器:它可以保存類型T的value,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測(cè),很好地解決了空指針異常處理的問題,比如可以使用isPresent()方法判斷value是否為null,使用get()方法獲取value值等等。

Optional的構(gòu)造方法是私有的,實(shí)例不能new,可以使用靜態(tài)方法來創(chuàng)建:

// 1、創(chuàng)建一個(gè)包裝對(duì)象值為空的Optional對(duì)象
Optional<String> optStr = Optional.empty();
// 2、創(chuàng)建包裝對(duì)象值非空的Optional對(duì)象
Optional<String> optStr1 = Optional.of("optional");
// 3、創(chuàng)建包裝對(duì)象值允許為空的Optional對(duì)象
Optional<String> optStr2 = Optional.ofNullable(null);

Optional簡(jiǎn)單案例

看完Optional的概述,我們用一個(gè)簡(jiǎn)單的例子說明一下:

下面這段代碼接收一個(gè)User對(duì)象,如果user為null,則拋出異常【這是一個(gè)非常常規(guī)的避免空指針異常的做法,如果沒有這步,getName會(huì)NPE】,否則返回user的name。

 public String getName1(User user) {
 if (user == null) {
 throw new RuntimeException("user不能為null!");
 }
 return user.getName();
 }

如果使用Optional,應(yīng)該怎么去處理呢?

 public String getName2(User user) {
 return Optional.ofNullable(user) // 包裝user對(duì)象,如果user為null,則返回空的Optional對(duì)象
 .map(User::getName)
 .orElseThrow(() -> new RuntimeException("user不能為null"));// 如果有值則返回,沒有則拋出異常。
 }

Optional使用靜態(tài)的ofNullable方法將user對(duì)象進(jìn)行包裝,將可能為null的user對(duì)象保護(hù)起來。

 public static <T> Optional<T> ofNullable(T value) {
 // empty() 方法 創(chuàng)建一個(gè)空的Optional對(duì)象, of對(duì)象在構(gòu)造Optional的時(shí)候,value如果weinull,會(huì)引發(fā)NPE
 return value == null ? empty() : of(value);
 }

orElseThrow方法接收一個(gè)Supplier 對(duì)象,這里我們?cè)趌ambda表達(dá)式那節(jié)已經(jīng)說過了,不再贅述,感興趣可以查看:Java8的Lambda表達(dá)式,你會(huì)不?

 public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
 // 如果有值,直接返回值
 if (value != null) {
 return value;
 } else {
 // 拋出異常,這個(gè)異常Supplier接口定義
 throw exceptionSupplier.get();
 }
 }

Optional的主要方法

方法 描述
empty 返回一個(gè)空的 Optional 實(shí)例
filter 如果值存在并且滿足提供的斷言, 就返回包含該值的 Optional 對(duì)象;否則返回一個(gè)空的 Optional 對(duì)象
map 如果值存在,就對(duì)該值執(zhí)行提供的 mapping 函數(shù)調(diào)用
flatMap 如果值存在,就對(duì)該值執(zhí)行提供的 mapping 函數(shù)調(diào)用,返回一個(gè) Optional 類型的值,否則就返 回一個(gè)空的 Optional 對(duì)象
get 如果該值存在,將該值用 Optional 封裝返回,否則拋出一個(gè) NoSuchElementException 異常
ifPresent 如果值存在,就執(zhí)行使用該值的方法調(diào)用,否則什么也不做
isPresent 如果值存在就返回 true,否則返回 false
of 將指定值用 Optional 封裝之后返回,如果該值為 null,則拋出一個(gè) NullPointerException 異常
ofNullable 將指定值用 Optional 封裝之后返回,如果該值為 null,則返回一個(gè)空的 Optional 對(duì)象
orElse 如果有值則將其返回,否則返回一個(gè)默認(rèn)值
orElseGet 如果有值則將其返回,否則返回一個(gè)由指定的 Supplier 接口生成的值
orElseThrow 如果有值則將其返回,否則拋出一個(gè)由指定的 Supplier 接口生成的異常

參考閱讀

Java 8 Optional 類

【java8新特性 簡(jiǎn)述】Optional

https://github.com/biezhi/learn-java8/blob/master/java8-optional/README.md

到此這篇關(guān)于Java8的Optional如何干掉空指針的文章就介紹到這了,更多相關(guān)Java8的Optional空指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC的概念以及快速入門示例

    SpringMVC的概念以及快速入門示例

    這篇文章主要介紹了SpringMVC的概念以及快速入門示例,SpringMVC 已經(jīng)成為目前最主流的MVC框架之一,它通過一套注解,讓一個(gè)簡(jiǎn)單的 Java 類成為處理請(qǐng)求的控制器,而無須實(shí)現(xiàn)任何接口,需要的朋友可以參考下
    2023-05-05
  • java 如何在list中刪除我指定的對(duì)象

    java 如何在list中刪除我指定的對(duì)象

    這篇文章主要介紹了java 如何在list中刪除我指定的對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 高效的java版排列組合算法

    高效的java版排列組合算法

    這篇文章主要為大家詳細(xì)介紹了高效的java版排列組合算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • java引用jpython的方法示例

    java引用jpython的方法示例

    這篇文章主要介紹了java引用jpython的方法,結(jié)合實(shí)例形式分析了java引用jpython及相關(guān)使用技巧,需要的朋友可以參考下
    2016-11-11
  • 關(guān)于Springboot如何獲取IOC容器

    關(guān)于Springboot如何獲取IOC容器

    大家好,我是孤焰。最近我在制作日志審計(jì)功能時(shí)發(fā)現(xiàn)不知道怎樣獲取到Springboot項(xiàng)目中的IOC容器,經(jīng)過摸索,最終解決了這個(gè)問題,現(xiàn)在把解決方式和大家分享一下
    2021-08-08
  • 詳解spring cloud分布式關(guān)于熔斷器

    詳解spring cloud分布式關(guān)于熔斷器

    這篇文章主要介紹了詳解spring cloud分布式關(guān)于熔斷器,詳細(xì)的介紹了什么是熔斷器和使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 深入淺出MappedByteBuffer(推薦)

    深入淺出MappedByteBuffer(推薦)

    MappedByteBuffer使用虛擬內(nèi)存,因此分配(map)的內(nèi)存大小不受JVM的-Xmx參數(shù)限制,但是也是有大小限制的,這篇文章主要介紹了MappedByteBuffer的基本知識(shí),需要的朋友可以參考下
    2022-12-12
  • Java?for循環(huán)倒序輸出的操作代碼

    Java?for循環(huán)倒序輸出的操作代碼

    在Java中,要實(shí)現(xiàn)一個(gè)for循環(huán)的倒序輸出,通常我們會(huì)使用數(shù)組或集合(如ArrayList)作為數(shù)據(jù)源,然后通過倒序遍歷這個(gè)數(shù)組或集合來實(shí)現(xiàn),這篇文章主要介紹了Java?for循環(huán)倒序輸出,需要的朋友可以參考下
    2024-07-07
  • java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例

    java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例

    這篇文章主要介紹了java簡(jiǎn)單實(shí)現(xiàn)八叉樹圖像處理代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • SpringBoot實(shí)現(xiàn)無限級(jí)評(píng)論回復(fù)的項(xiàng)目實(shí)踐

    SpringBoot實(shí)現(xiàn)無限級(jí)評(píng)論回復(fù)的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot實(shí)現(xiàn)無限級(jí)評(píng)論回復(fù)的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論