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

Java中Optional.of()方法及源碼解析(非常詳細(xì)!)

 更新時(shí)間:2024年06月08日 08:55:43   作者:c137范特西  
這篇文章主要給大家介紹了關(guān)于Java中Optional.of()方法及源碼解析的相關(guān)資料,Java中java.util .Optional類的of()方法用于獲得該Optional類中具有指定類型的指定值的一個(gè)實(shí)例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在Java中,Optional.of() 方法是 Optional 類中用于創(chuàng)建包含非空值的 Optional 對(duì)象的靜態(tài)方法。在本文中,我們將深入解析 Optional.of() 的語法、使用場(chǎng)景,并通過多個(gè)示例詳細(xì)說明。

方法解析

1. Optional.of() 方法的語法

public static <T> Optional<T> of(T value)
  • 參數(shù): 非空的值 value。
  • 返回值: 包含指定值的 Optional 對(duì)象。

2. 使用示例

2.1 創(chuàng)建包含字符串的 Optional 對(duì)象

Optional<String> optional = Optional.of("Hello, World!");

上述代碼創(chuàng)建了一個(gè)包含字符串 “Hello, World!” 的 Optional 對(duì)象。由于傳入的值是非空的,因此不會(huì)引發(fā) NullPointerException

2.2 創(chuàng)建包含自定義對(duì)象的 Optional 對(duì)象

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Person person = new Person("John Doe");
Optional<Person> optionalPerson = Optional.of(person);

這個(gè)示例中,我們定義了一個(gè) Person 類,并使用 Optional.of() 創(chuàng)建了一個(gè)包含 Person 對(duì)象的 Optional 對(duì)象。

2.3 注意事項(xiàng)

Optional<String> optional = Optional.of(null); // 會(huì)拋出 NullPointerException

Optional.of() 要求傳入的值不能為 null,否則會(huì)拋出 NullPointerException。在上述示例中,傳入了 null 值,導(dǎo)致拋出異常。

3. 使用場(chǎng)景

Optional.of() 適用于確定值不為空的情況,提供了一種安全的方式來包裝非空值,避免了空指針異常。但需要注意確保傳入的值非空,否則會(huì)引發(fā)異常。

源碼解析

1. Optional.of() 方法的源碼

public static <T> Optional<T> of(T value) {
    return new Optional<>(Objects.requireNonNull(value));
}

上述源碼顯示了 Optional.of() 方法的實(shí)現(xiàn)。以下是對(duì)源碼的解析:

  • public static <T> Optional<T> of(T value) {: 這是一個(gè)靜態(tài)方法聲明,返回類型是 Optional<T>,其中 <T> 是泛型參數(shù),表示 Optional 包含的值的類型。參數(shù) value 是需要包裝的非空值。

  • return new Optional<>(Objects.requireNonNull(value));: 在方法體內(nèi),首先使用 Objects.requireNonNull(value) 確保傳入的值不為 null。如果傳入的值為 null,Objects.requireNonNull 方法會(huì)拋出 NullPointerException。

    然后,通過 new Optional<>(...) 創(chuàng)建一個(gè)新的 Optional 對(duì)象,將傳入的非空值包裝在其中。

2. 源碼解析總結(jié)

  • Optional.of() 方法通過 Objects.requireNonNull 確保傳入的值非空,否則拋出 NullPointerException
  • 創(chuàng)建了一個(gè)新的 Optional 對(duì)象,并將傳入的非空值包裝在其中。

3. 注意事項(xiàng)

在使用 Optional.of() 時(shí),一定要確保傳入的值不為 null,否則會(huì)導(dǎo)致異常。如果不能確定值是否為 null,建議使用 Optional.ofNullable() 方法。

4. Optional 類的基本結(jié)構(gòu)

在深入解析 Optional.of() 的源碼之前,我們先了解一下 Optional 類的基本結(jié)構(gòu)。Optional 類的核心思想是包裝可能為 null 的值,提供了一些方法來處理這種情況。

public final class Optional<T> {

    private static final Optional<?> EMPTY = new Optional<>();

    private final T value;

    private Optional() {
        this.value = null;
    }

    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

    public static <T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    public boolean isPresent() {
        return value != null;
    }

    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

    // 其他方法省略...
}

上述是 Optional 類的簡(jiǎn)化版本,其中包含了 of() 方法的源碼。關(guān)鍵部分解析如下:

  • EMPTYOptional 類的一個(gè)靜態(tài)常量,表示空的 Optional 對(duì)象。
  • value:私有字段,用于保存包裝的值。
  • of(T value):靜態(tài)工廠方法,用于創(chuàng)建包含非空值的 Optional 對(duì)象。
  • ofNullable(T value):靜態(tài)工廠方法,用于創(chuàng)建包含可能為 null 值的 Optional 對(duì)象。
  • empty():靜態(tài)工廠方法,用于創(chuàng)建空的 Optional 對(duì)象。
  • isPresent():判斷 Optional 對(duì)象是否包含值。
  • get():獲取 Optional 對(duì)象中的值,如果值為空則拋出 NoSuchElementException

6. Optional.of() 源碼解析

現(xiàn)在我們來看一下 Optional.of() 方法的源碼:

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}

這個(gè)方法非常簡(jiǎn)單,它直接調(diào)用 Optional 類的私有構(gòu)造函數(shù) private Optional(T value) 來創(chuàng)建一個(gè)新的 Optional 對(duì)象,并將傳入的值包裝在其中。

private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}

在構(gòu)造函數(shù)中,首先通過 Objects.requireNonNull(value) 確保傳入的值非空,否則拋出 NullPointerException。然后將非空值保存在 value 字段中。

這就是 Optional.of() 方法的基本邏輯??傮w來說,Optional 類提供了一種安全地處理可能為 null 值的方式,而 Optional.of() 則是其中的一個(gè)關(guān)鍵方法,用于創(chuàng)建包含非空值的 Optional 對(duì)象。

4. 總結(jié)

Optional.of() 是創(chuàng)建包含非空值的 Optional 對(duì)象的方法。通過深入解析其語法、使用示例以及注意事項(xiàng),我們更好地理解了該方法的作用和適用場(chǎng)景。在使用時(shí),確保傳入的值非空,以保證安全使用 Optional。在不確定值是否為空的情況下,建議使用 Optional.ofNullable() 方法。

附:Optional.of()和Optional.ofNullable()區(qū)別

Optional.of()或者Optional.ofNullable():創(chuàng)建Optional對(duì)象,差別在于of不允許參數(shù)是null,而ofNullable則無限制。

// 參數(shù)不能是null,是null拋異常
Optional<Integer> optional1 = Optional.of(1);
 
// 參數(shù)可以是null
Optional<Integer> optional2 = Optional.ofNullable(null);
 
// 參數(shù)可以是非null
Optional<Integer> optional3 = Optional.ofNullable(2);

空指針異常是導(dǎo)致Java應(yīng)用程序失敗的最常見原因。以前,為了解決空指針異常,Google公司著名的Guava項(xiàng)目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵(lì)程序員寫更干凈的代碼。受到Google Guava的啟發(fā),Optional類已經(jīng)成為Java 8類庫的一部分。Optional實(shí)際上是個(gè)容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測(cè)。

通過of(T value)函數(shù)所構(gòu)造出的Optional對(duì)象,當(dāng)Value值為空時(shí),依然會(huì)報(bào)NullPointerException。

到此這篇關(guān)于Java中Optional.of()方法及源碼解析的文章就介紹到這了,更多相關(guān)Java Optional.of()方法源碼解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解多線程及Runable 和Thread的區(qū)別

    詳解多線程及Runable 和Thread的區(qū)別

    這篇文章主要介紹了多線程及Runable 和Thread的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • springboot集成測(cè)試?yán)锏膔edis

    springboot集成測(cè)試?yán)锏膔edis

    這篇文章主要介紹了springboot集成測(cè)試?yán)锏膔edis,本文給大家分享了源碼,添加依賴添加mock的方法,需要的朋友可以參考下
    2018-11-11
  • SpringBoot整合Netty心跳機(jī)制過程詳解

    SpringBoot整合Netty心跳機(jī)制過程詳解

    這篇文章主要介紹了SpringBoot整合Netty心跳機(jī)制過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring中事務(wù)幾個(gè)常見的問題解決

    Spring中事務(wù)幾個(gè)常見的問題解決

    這篇文章主要介紹了Spring中事務(wù)幾個(gè)常見的問題解決,事務(wù)這個(gè)概念是數(shù)據(jù)庫層面的,Spring只是基于數(shù)據(jù)庫中的事務(wù)進(jìn)行擴(kuò)展,以及提供了一些能讓程序員更新方便操作事務(wù)的方式
    2022-08-08
  • Java多線程之線程狀態(tài)的遷移詳解

    Java多線程之線程狀態(tài)的遷移詳解

    線程狀態(tài)遷移,又常被稱作線程的生命周期,指的是線程從創(chuàng)建到終結(jié)需要經(jīng)歷哪些狀態(tài),什么情況下會(huì)出現(xiàn)哪些狀態(tài).線程的狀態(tài)直接關(guān)系著并發(fā)編程的各種問題,本文就線程的狀態(tài)遷移做一初步探討,并總結(jié)在何種情況下會(huì)出現(xiàn)這些狀態(tài),需要的朋友可以參考下
    2021-06-06
  • 向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索

    向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索

    這篇文章主要介紹了向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索,在向量函數(shù)的計(jì)算過程中,會(huì)對(duì)所有匹配的文檔進(jìn)行線性掃描,因此,查詢預(yù)計(jì)時(shí)間會(huì)隨著匹配文檔的數(shù)量線性增長(zhǎng),本文給大家講解的非常詳細(xì),需要的朋友參考下吧
    2023-06-06
  • Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼

    Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼

    Java實(shí)現(xiàn)單鏈表反轉(zhuǎn),遞歸和非遞歸兩種形式。接下來通過本文給大家分享Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼,需要的的朋友參考下
    2017-03-03
  • 一文掌握J(rèn)ava 數(shù)據(jù)結(jié)構(gòu)超詳細(xì)筆記(收藏版)

    一文掌握J(rèn)ava 數(shù)據(jù)結(jié)構(gòu)超詳細(xì)筆記(收藏版)

    本文給大家介紹Java數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、鏈表、List、Set、Map及迭代器,對(duì)比了其內(nèi)存特性、操作效率和應(yīng)用場(chǎng)景,并介紹了哈希及沖突解決方法,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Spring使用注解進(jìn)行對(duì)象裝配(DI)的操作

    Spring使用注解進(jìn)行對(duì)象裝配(DI)的操作

    獲取Bean對(duì)象也叫做對(duì)象裝配,就是把對(duì)象取出來放到某個(gè)類中,有時(shí)候也叫對(duì)象注入,這篇文章主要介紹了Spring使用注解進(jìn)行對(duì)象裝配(DI),需要的朋友可以參考下
    2023-07-07
  • 詳解Java包裝類及自動(dòng)裝箱拆箱

    詳解Java包裝類及自動(dòng)裝箱拆箱

    這篇文章主要介紹了Java包裝類及自動(dòng)裝箱拆箱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

庆安县| 天全县| 太湖县| 天门市| 渑池县| 南投县| 沈丘县| 托克托县| 察隅县| 宜兴市| 芜湖市| 句容市| 湘潭县| 炎陵县| 海盐县| 商丘市| 广南县| 林口县| 化隆| 中西区| 西丰县| 洪湖市| 涿州市| 崇阳县| 多伦县| 仁怀市| 安塞县| 涪陵区| 思茅市| 彝良县| 平阴县| 斗六市| 泽州县| 凌云县| 沙河市| 客服| 江川县| 玉山县| 阜新| 兴国县| 九龙县|