最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Optional的orElse操作及orElse與orElseGet的區(qū)別詳解

 更新時(shí)間:2025年05月02日 09:15:58   作者:小學(xué)雞!  
Optional中orElse可能導(dǎo)致空指針異常,orElseGet可以避免這種情況,這篇文章主要介紹了Java中Optional的orElse操作及orElse與orElseGet區(qū)別的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下

1. 大概說(shuō)明

這篇文章的目的是為了說(shuō)明:

  • orElse 如何使用
  • orElseGet 如何使用
  • 兩者的區(qū)別

備注:orElse 可能導(dǎo)致 NullPointerException,當(dāng) orElse 的參數(shù)是間接計(jì)算得來(lái)的時(shí)候。雖然這種說(shuō)法有點(diǎn)牽強(qiáng)(因?yàn)椴⒉皇莖rElse導(dǎo)致了空指針異常),但是使用 orElseGet 確實(shí)可以避免這種情況。

2. 詳細(xì)分析

2.1 .orElse 操作

先看個(gè)例子:

Optional<String> optional = Optional.empty();
System.out.println(optional.isPresent); // ---->輸出:false
// 返回 false,表示 Optional 里沒(méi)有值。

解析:

  • Optional.empty() 代表 一個(gè)空的 Optional 實(shí)例,即 Optional 沒(méi)有值。
  • Optional.ofNullable(null) 等價(jià)于 Optional.empty()。

2.2 .orElse 的作用:避免空指針異常

  • 如果 Optional 為空(即 Optional.empty()),就返回 orElse() 里提供的默認(rèn)值。
  • 如果 Optional 有值,就直接返回這個(gè)值,不執(zhí)行 orElse() 提供的默認(rèn)值。

注意:不管 Optional 為不為空,這個(gè)值都會(huì)創(chuàng)建,只不過(guò)為空時(shí),才使用

// 舉例:當(dāng)Optional為空時(shí),orElse()才會(huì)觸發(fā)
String result = Optional.ofNullable(null)
    .orElse("默認(rèn)值");
System.out.println(result); // ---->輸出:默認(rèn)值
// 再舉個(gè)例子:
Map<Long, List<String>> map = new HashMap<>();
map.put(1L, Arrays.asList("A", "B", "C"));

List<String> result = Optional.ofNullable(map.get(1L))
    .orElse(Collections.emptyList()); // 為null就返回 空列表
System.out.println(result);  // ---->輸出:[A, B, C] (orElse() 沒(méi)起作用)

2.3 為什么要用?

List<String> result = Optional.ofNullable(map.get(0L))
    .orElse(Collections.emptyList())
    .stream();

如果 map.get(0L) == null,那么:

  • 不加 .orElse(Collections.emptyList()) → .stream() 會(huì)報(bào) NullPointerException ?
  • 加了 .orElse(Collections.emptyList()) → .stream() 能正常執(zhí)行 ?

2.4 orElseGet如何使用

再來(lái)看看 orElseGet 中如何使用:

orElseGet 作用:獲取數(shù)據(jù)并且設(shè)置數(shù)據(jù)為空時(shí)的默認(rèn)值。如果數(shù)據(jù)不為空就能獲取到該數(shù)據(jù);如果為空則返回傳入的參數(shù)來(lái)創(chuàng)建對(duì)象。

具體的使用案例可看下圖:

2.5 orElse和orElseGet的區(qū)別

orElse() 和 orElseGet() 都是Optional 類中的方法,用于在 Optional 為空時(shí)提供默認(rèn)值。但它們的區(qū)別在于 默認(rèn)值的獲取方式

1、orElse(T other)

  • 直接傳遞一個(gè)默認(rèn)值
  • 即使 Optional里有值,也會(huì)創(chuàng)建 other 對(duì)象,但不會(huì)使用它
  • 適用于默認(rèn)值創(chuàng)建代價(jià)較低的情況

2、orElseGet(Supplier<? extends T> supplier)

  • 傳遞的是一個(gè) Supplier(懶加載:只有需要的時(shí)候才會(huì)創(chuàng)建)接口,它是一個(gè)函數(shù)式接口,形式是這樣的:()->{ return computedResult },即入?yún)榭?,有返回值(任意類型的?/li>
  • 僅當(dāng) Optional 為空時(shí)才會(huì)執(zhí)行 supplier.get(),不會(huì)提前創(chuàng)建默認(rèn)值
  • 適用于默認(rèn)值創(chuàng)建代價(jià)較高的情況

看個(gè)例子:

class User {
    // 中文名
	private String chineseName;
	// 英文名
	private EnglishName englishName;
}

class EnglishName {
    // 全名
    private String fullName;
    // 簡(jiǎn)寫
    private String shortName;
}

假如我們現(xiàn)在有 User 類,用戶注冊(cè)賬號(hào)時(shí),需要提供自己的中文名或英文名,或都提供,我們抽象出一個(gè)EnglishName 類,它包含英文名的全名和簡(jiǎn)寫(因?yàn)橛械挠⑽拿_實(shí)太長(zhǎng)了)。現(xiàn)在,我們希望有一個(gè)User.getName() 方法,它可以像下面這樣實(shí)現(xiàn):

class User {
    // ... 之前的內(nèi)容
    public String getName1() {
        return Optional.ofNullable(chineseName)
                .orElse(englishName.getShortName());
    }
    
    public String getName2() {
        return Optional.ofNullable(chineseName)
                .orElseGet(() -> englishName.getShortName());
    }
}

寫了兩個(gè)版本,分別使用 orElse 和 orElseGet?,F(xiàn)在,你可以看出 getName1() 方法有什么風(fēng)險(xiǎn)了嗎?它會(huì)出現(xiàn)空指針異常嗎?----> 是的。當(dāng)用戶只提供了中文名時(shí),此時(shí) englishName 屬性是 null,但是在 orElse 中,englishName.getShortName()總是會(huì)執(zhí)行。而在 getName2() 中,這個(gè)風(fēng)險(xiǎn)卻沒(méi)有。

再舉個(gè)例子:

public class Test {
    public static void main(String[] args) {
        System.out.println("orElse() 的情況:");
        String result1 = Optional.ofNullable("實(shí)際值")
            .orElse(test2());
        System.out.println("最終結(jié)果: " + result1);

        System.out.println("orElseGet() 的情況:");
        String result2 = Optional.ofNullable("實(shí)際值")
            .orElseGet(() -> test2());
        System.out.println("最終結(jié)果: " + result2);
    }

    public static String test2() {
        System.out.println("執(zhí)行昂貴的計(jì)算...");
        return "昂貴默認(rèn)值";
    }
}

輸出:

orElse() 的情況:
執(zhí)行昂貴的計(jì)算...
最終結(jié)果: 實(shí)際值

orElseGet() 的情況:
最終結(jié)果: 實(shí)際值

總結(jié)

到此這篇關(guān)于Java中Optional的orElse操作及orElse與orElseGet區(qū)別詳解的文章就介紹到這了,更多相關(guān)Java Optional的orElse操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Java并發(fā)計(jì)數(shù)器的深入理解

    Java并發(fā)計(jì)數(shù)器的深入理解

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)計(jì)數(shù)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 解決Java中基于GeoTools的Shapefile讀取亂碼的問(wèn)題

    解決Java中基于GeoTools的Shapefile讀取亂碼的問(wèn)題

    本文主要討論了在使用Java編程語(yǔ)言進(jìn)行地理信息數(shù)據(jù)解析時(shí)遇到的Shapefile屬性信息亂碼問(wèn)題,以及根據(jù)不同的編碼設(shè)置進(jìn)行屬性信息解析的方法,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • Java常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解

    Java常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解

    這篇文章主要介紹了Java常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解,棧(Stack) 是一種基本的數(shù)據(jù)結(jié)構(gòu),具有后進(jìn)先出(LIFO)的特性,類似于現(xiàn)實(shí)生活中的一疊盤子,棧用于存儲(chǔ)一組元素,但只允許在棧頂進(jìn)行插入(入棧)和刪除(出棧)操作,需要的朋友可以參考下
    2023-10-10
  • SpringBoot學(xué)習(xí)之基于注解的緩存

    SpringBoot學(xué)習(xí)之基于注解的緩存

    spring boot對(duì)緩存支持非常靈活,我們可以使用默認(rèn)的EhCache,也可以整合第三方的框架,只需配置即可,下面這篇文章主要給大家介紹了關(guān)于SpringBoot學(xué)習(xí)之基于注解緩存的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 淺談Java?abstract關(guān)鍵字不能和哪些關(guān)鍵字共存

    淺談Java?abstract關(guān)鍵字不能和哪些關(guān)鍵字共存

    本文主要介紹了Java?abstract關(guān)鍵字不能和哪些關(guān)鍵字共存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10
  • 淺談關(guān)于spring profile的誤解

    淺談關(guān)于spring profile的誤解

    這篇文章主要介紹了淺談關(guān)于spring profile的誤解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的開(kāi)發(fā)工作中,處理數(shù)據(jù)庫(kù)查詢是一個(gè)非常常見(jiàn)的任務(wù),尤其是當(dāng)我們需要在復(fù)雜條件下篩選數(shù)據(jù)時(shí),如何編寫高效、簡(jiǎn)潔且可維護(hù)的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下
    2024-10-10
  • linux配置jdk環(huán)境變量簡(jiǎn)單教程

    linux配置jdk環(huán)境變量簡(jiǎn)單教程

    這篇文章主要為大家詳細(xì)介紹了linux配置jdk環(huán)境變量簡(jiǎn)單教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • java如何實(shí)現(xiàn)postman中用x-www-form-urlencoded參數(shù)的請(qǐng)求

    java如何實(shí)現(xiàn)postman中用x-www-form-urlencoded參數(shù)的請(qǐng)求

    在Java開(kāi)發(fā)中,模擬Postman發(fā)送x-www-form-urlencoded類型的請(qǐng)求是一個(gè)常見(jiàn)需求,本文主要介紹了如何在Java中實(shí)現(xiàn)這一功能,首先,需要通過(guò)導(dǎo)入http-client包來(lái)創(chuàng)建HTTP客戶端,接著,利用該客戶端發(fā)送Post請(qǐng)求
    2024-09-09
  • 最新評(píng)論

    高尔夫| 南丹县| 历史| 阿拉善左旗| 顺平县| 博兴县| 通化县| 利津县| 开江县| 贺兰县| 乌鲁木齐县| 姚安县| 翼城县| 德州市| 洱源县| 芦山县| 罗平县| 山东| 荔波县| 合水县| 静海县| 全椒县| 鹤壁市| 海安县| 关岭| 惠水县| 三明市| 乌拉特后旗| 镇沅| 江北区| 新乡市| 赤城县| 小金县| 永年县| 岳阳县| 黑山县| 汶川县| 北宁市| 北流市| 墨竹工卡县| 宁安市|