在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JDK8新增的Optional類的常用方法

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-30 15:13 ? 次閱讀

一、摘要

NullPointerException,中文名: 空指針異常 ,也簡稱 NPE,是軟件系統中最常見的錯誤異常之一。

很久以前 Google Guava 項目引入了Optional作為解決空指針異常的一種方式,不贊成寫過多的代碼來顯式檢查null,以期望程序員寫出整潔同時可讀性更高的代碼。

受 Google Guava 的影響,Optional 現在也成為了Java 8 及以上庫代碼的一部分。

在介紹Optional技術之前,我們不禁會發出一個疑問:為什么谷歌不贊成寫過多的代碼來顯式檢查null

下面是某個常見的參數判空代碼,樣例如下。

// 判斷行政區是否為空
if(country != null){
    // 判斷行政區的上一級,行政城市是否為空
    if(country.getCity() != null){
        // 判斷行政城市的上一級,行政省是否為空
        if(country.getCity().getProvince() != null){
            // 獲取對應的行政省相關的數據
            return country.getCity().getProvince().getName();
        }
    }
}

這還是最普通的三層判斷,假如有很大一段業務邏輯處理的時候,你會發現代碼不光看起來很臃腫,并且難以閱讀,可讀性很差!

如果調整為使用Optional來編寫的話,可以轉換成如下寫法:

// 獲取當前行政區最頂級的省信息名稱
String result  = Optional.ofNullable(country)
                .map(Country::getCity)
                .map(City::getProvince)
                .map(Province::getName)
                .orElse("error");

采用Optional編程之后,整個代碼的可讀性和整潔度,是不是要干凈很多!

這也是為什么推薦大家使用Optional的原因啦!

當然廢話也不多說,代碼直接擼起來!

二、案例實踐

在 JDK8 中,Optional 共有 12 個核心方法,下面我們一起來看看他們的用法!

2.1、empty()

empty 方法返回一個不包含值的 Optional 實例,單獨使用沒什么意義,主要和其他方法搭配使用。

Optional optional = Optional.empty();
System.out.println(optional);
-- 輸出結果
Optional.empty

2.2、of()

of 方法會返回一個 Optional 實例,如果傳入的值非空,會返回包含指定值的對象;如果傳入空,會立刻拋出空指針異常。

// 非空情況下,會正常返回
Optional optional = Optional.of("hello world");
System.out.println(optional);
-- 輸出結果
Optional[hello world]
// 為空情況下,會拋空指針異常
Optional optional = Optional.of(null);
System.out.println(optional);
-- 輸出結果
Exception in thread "main" java.lang.NullPointerException
 at java.util.Objects.requireNonNull(Objects.java:203)
 at java.util.Optional.< init >(Optional.java:96)
 at java.util.Optional.of(Optional.java:108)

2.3、ofNullable()

ofNullable 方法會返回一個 Optional 實例,如果傳入的值非空,會返回包含指定值的對象;如果傳入空,會返回不包含任何值的 empty 對象,也就是最開始介紹的Optional.empty()對象。

// 非空情況下,會正常返回
Optional optional = Optional.ofNullable("hello world");
System.out.println(optional);
-- 輸出結果
Optional[hello world]
// 為空情況下,會返回 empty 對象
Optional optional = Optional.ofNullable(null);
System.out.println(optional);
-- 輸出結果
Optional.empty

2.4、isPresent()

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

// 非空值,返回true
boolean rs1 =  Optional.ofNullable("hello").isPresent();
System.out.println(rs1);

// 空值,返回false
boolean rs2 =  Optional.ofNullable(null).isPresent();
System.out.println(rs2);
-- 輸出結果
true
false

2.5、get()

get 方法,如果實例包含非空值,則返回當前值;否則拋出 NoSushElementException 異常。

// 非空值,返回當前值
Object rs =  Optional.ofNullable("hello world").get();
System.out.println(rs);
-- 輸出結果
hello world
// 空值,會拋出 NoSushElementException 異常
Object rs =  Optional.ofNullable(null).get();
System.out.println(rs);
-- 輸出結果
Exception in thread "main" java.util.NoSuchElementException: No value present
 at java.util.Optional.get(Optional.java:135)

2.6、ifPresent()

ifPresent 方法作用是當實例包含非空值時,執行傳入的 Consumer,比如調用一些其他方法;如果包含的值為空,不執行任何操作。

Optional.ofNullable("hello world")
                .ifPresent( x - > {
                    System.out.println(x);
                });
-- 輸出結果
hello world

2.7、filter()

filter 方法用于過濾不符合條件的值,接收一個Predicate參數,如果符合條件,會返回當前的Optional實例,否則返回 empty 實例。

Optional.ofNullable("hello world")
                .filter(x - > x.contains("hello"))
                .ifPresent(x - > {
                    System.out.println(x);
                });
-- 輸出結果
hello world

2.8、map()

map 方法是鏈式調用避免空指針的核心方法,當實例包含值時,對值執行傳入的Function函數接口方法,并返回一個代表結果值新的Optional實例,也就是將返回的結果再次包裝成Optional對象。

Optional.ofNullable("hello+world")
                .map(t - > {
                    if(t.contains("+")){
                        return t.replace("+", " ");
                    }
                    return t;
                }).ifPresent(t - > {
                    System.out.println(t);
                });
-- 輸出結果
hello world

2.9、flatMap()

flatMap 方法與 map 方法類似,唯一不同的地方在于: 需要手動將返回的值,包裝成Optional實例,并且參數值不允許為空

Optional.ofNullable("hello+world")
                .flatMap(t - > {
                    if(t.contains("+")){
                        t =  t.replace("+", " ");
                    }
                    // 不同之處
                    return Optional.of(t);
                }).ifPresent(t - > {
                    System.out.println(t);
                });
-- 輸出結果
hello world

2.10、orElse()

orElse 方法作用是如果實例包含非空值,那么返回當前值;否則返回指定的默認值。

Object rs =  Optional.ofNullable(null).orElse("null");
System.out.println(rs);
-- 輸出結果
null

2.11、orElseGet()

orElseGet 方法作用是如果實例包含非空值,返回這個值;否則,它會執行作為參數傳入的Supplier函數式接口方法,并返回其執行結果。

Object result = Optional.ofNullable(null)
                .orElseGet(() - > {
                    return "error";
                });
System.out.println(result);
-- 輸出結果
error

2.12、orElseThrow()

orElseThrow 方法作用是如果實例包含非空值,返回這個值;否則,它會執行作為參數傳入的異常類。

Optional.ofNullable(null)
                .orElseThrow(() - > new RuntimeException("參數為空"));
-- 輸出結果
Exception in thread "main" java.lang.RuntimeException: 參數為空
 at com.x.x.x.x.OptionalTest.lambda$main$10(OptionalTest3.java:144)
 at java.util.Optional.orElseThrow(Optional.java:290)

三、小結

以上就是 JDK8 新增的Optional類的常用方法總結,其中ofNullablemaporElse方法搭配使用的最多。

另外orElseorElseGetorElseThrow區別如下:

  • orElse:如果實例包含空值,返回傳入指定的值
  • orElseGet:如果實例包含空值,返回傳入的方法中返回值
  • orElseThrow:如果實例包含空值,返回指定的異常類型

在實際使用的時候,還得結合具體的場景進行合理選擇,有時候并不是全部采用Optional來解決NPE異常代碼才更加優雅,比如當前對象比較簡單,就是一個簡單判斷,通過obj != null足以解決問題。

因此在保證業務功能的正確和穩定性的基礎之上,適當的選擇相關的工具來優化代碼的整潔度和可讀性,更能發揮出錦上添花的效果!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    117

    文章

    3787

    瀏覽量

    81043
  • 代碼
    +關注

    關注

    30

    文章

    4788

    瀏覽量

    68612
  • 軟件系統
    +關注

    關注

    0

    文章

    63

    瀏覽量

    9505
  • jdk8
    +關注

    關注

    0

    文章

    4

    瀏覽量

    1922
收藏 人收藏

    評論

    相關推薦

    JDK動態代理的原理

    在Java中,動態代理是一種機制,允許在運行時動態地創建代理對象來代替某個實際對象,從而在其前后執行額外的邏輯。 為什么JDK動態代理只能代理接口實現,原因是JDK動態代理是基于接口實現的。 當你
    的頭像 發表于 09-30 10:51 ?583次閱讀

    樹莓派安裝JDK

    /jdk8-downloads-2133151.html最新版本jdk8下載的文件jdk-7u60-linux-arm-vfp-hflt.tar.gz 2、在home下面創建tool文件夾,解壓
    發表于 03-05 15:12

    畢昇JDK 8 Dynamic CDS 特性介紹

    內存中的到 JSA 文件。畢昇JDK 8 中實現的 Dynamic CDS 特性相比之前的 AppCDS ,增加了 Custom ClassLoader 的支持,擴展了共享的支持
    發表于 12-23 16:19

    JDK8 Optional新特性

    Optional不是對null關鍵字的一種替代,而是對于null判定提供了一種更加優雅的實現。 NullPointException可以說是所有java程序員都遇到過的一個異常,雖然java從
    發表于 11-28 14:33 ?1776次閱讀

    Java數組的常用方法_Java:數組工具Arrays常用方法的用法及代碼

    本文主要詳細介紹了Java數組的常用方法以及數組工具Arrays常用方法的用法及代碼。
    發表于 01-29 10:25 ?2923次閱讀

    簡述那些JDK中坑你沒商量的方法

    前言 JDK 作為我們每天必備的調用庫,里面大量提供了基礎供我們使用。可以說離開 JDK ,我們的 Java代碼寸步難行。 JDK 帶給
    的頭像 發表于 06-12 17:36 ?1236次閱讀
    簡述那些<b class='flag-5'>JDK</b>中坑你沒商量的<b class='flag-5'>方法</b>

    如何解決JDK8小版本升級后性能下降的問題

    編者按:在升級 JDK8U 的小版本后(從 8u74 升級到 8u202),遇到性能劇烈下降的問題(性能下降 13 倍)。該應用是一個非常簡單的 Web 應用,且應用在 JDK 升級前
    的頭像 發表于 07-26 14:44 ?4111次閱讀
    如何解決<b class='flag-5'>JDK8</b>小版本升級后性能下降的問題

    畢昇JDK8JDK11首次同時發布兩個版本

    2021 年 9 月 30 日,畢昇 JDK update Q3 版本正式發布,本次發布將包含 X86_64 版本。此前,畢昇 JDK 只發布 Aarch64 版本,這可能會對運維產生一定
    的頭像 發表于 10-28 10:53 ?3301次閱讀
    畢昇<b class='flag-5'>JDK8</b>和<b class='flag-5'>JDK</b>11首次同時發布兩個版本

    JAVA8提供了Optional來優化這種寫法

    這種寫法是比較丑陋的,為了避免上述丑陋的寫法,讓丑陋的設計變得優雅。JAVA8提供了Optional來優化這種寫法,接下來的正文部分進行詳細說明
    的頭像 發表于 04-24 15:18 ?1087次閱讀

    JDK8 Stream數據流效率分析

    Stream 是Java SE 8庫中新增的關鍵抽象,它被定義于 java.util.stream (這個包里有若干流類型:Stream 代表對象引用流,此外還有一系列特化流,如 IntStream,LongStream
    的頭像 發表于 08-17 10:53 ?1248次閱讀

    基于JDK 1.8來分析Thread的源碼

    由上圖我們可以看出,Thread實現了Runnable接口,而Runnable在JDK 1.8中被@FunctionalInterface注解標記為函數式接口,Runnable接口在JDK 1.8中的源代碼如下所示。
    的頭像 發表于 02-06 17:12 ?629次閱讀

    Java中Arrays是什么 Arrays常用方法

    了解Arrays的概念 **A****rrays** 位于java.util包下,Arrays是一個操作數組的工具。 Arrays常用方法 Arrays.fill:
    的頭像 發表于 02-17 15:11 ?1050次閱讀
    Java中Arrays<b class='flag-5'>類</b>是什么 Arrays<b class='flag-5'>常用</b><b class='flag-5'>方法</b>

    JDK中java.lang.Arrays 的源碼解析

    揭開它神秘的面紗。 java.util.Arrays JDK 提供的一個工具,用來處理數組的各種方法,而且每個方法基本上都是靜態
    的頭像 發表于 10-11 15:31 ?616次閱讀
    <b class='flag-5'>JDK</b>中java.lang.Arrays <b class='flag-5'>類</b>的源碼解析

    JDK11升級JDK17最全實踐干貨來了

    1、前言 如果你仍在使用JDK8,那你是否曾經遇到過OutOfMemoryError的問題?你是否曾經為JVM的調優問題感到困擾?本篇文章將為你介紹一種能夠提供百倍性能提升的垃圾回收器,也許能夠
    的頭像 發表于 06-25 14:50 ?729次閱讀
    <b class='flag-5'>JDK</b>11升級<b class='flag-5'>JDK</b>17最全實踐干貨來了

    JDK8升級JDK11最全實踐干貨來了

    呢?值得我們升級嗎?而且升級過程會遇到哪些問題呢?帶著這些問題,本篇文章將帶來完整的JDK8升級JDK11最全實踐。 2、為什么升級JDK11 1)性能提升 更好的垃圾收機制、更快的
    的頭像 發表于 06-25 14:51 ?440次閱讀
    <b class='flag-5'>JDK8</b>升級<b class='flag-5'>JDK</b>11最全實踐干貨來了
    主站蜘蛛池模板: 美女国产一区| 中文天堂最新版www官网在线| 99久久99这里只有免费费精品 | 欧美大胆一级视频| 中文在线免费看影视| 很黄很黄的网站免费的| 天堂色| 韩国三级理在线视频观看| 97午夜精品| 欧美极品bbbbⅹxxxx| 欧美性黑人十极品hd| 韩国一区二区三区视频| 明日花绮罗在线观看| 6080伦理久久精品亚洲| 欧美网站黄| 日本经典在线三级视频| 丁香五香天堂网| 97人洗澡人人澡人人爽| 哪个网站可以看av| 免费观看黄色网页| 精品在线一区二区三区| 亚洲一级香蕉视频| 欧美性爽xxxⅹbbbb| 天天拍夜夜操| 国产叼嘿视频网站在线观看 | 最近2018中文字幕2019视频| 你懂的在线视频观看| 美女一级毛片免费观看| 亚洲欧美在线精品一区二区| 成年网站在线| 久热国产精品| 男女视频在线观看| 精品一区二区三区免费毛片爱| 国产福利影视| 一级特黄a大片免费| 藏经阁在线观看| 亚洲网站在线看| 黄色大片毛片| 国产午夜精品理论片免费观看| 国产精品丝袜| 成人久久久|