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

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

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

前言

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

方法解析

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

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

2. 使用示例

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

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

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

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

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);

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

2.3 注意事項

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

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

3. 使用場景

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

源碼解析

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

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

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

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

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

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

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

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

3. 注意事項

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

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

在深入解析 Optional.of() 的源碼之前,我們先了解一下 Optional 類的基本結(jié)構。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 類的簡化版本,其中包含了 of() 方法的源碼。關鍵部分解析如下:

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

6. Optional.of() 源碼解析

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

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

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

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

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

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

4. 總結(jié)

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

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

Optional.of()或者Optional.ofNullable():創(chuàng)建Optional對象,差別在于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);

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

通過of(T value)函數(shù)所構造出的Optional對象,當Value值為空時,依然會報NullPointerException。

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

相關文章

  • 帶大家深入了解Spring事務

    帶大家深入了解Spring事務

    Spring框架提供統(tǒng)一的事務抽象,通過統(tǒng)一的編程模型使得應用程序可以很容易地在不同的事務框架之間進行切換. 在學習Spring事務前,我們先對數(shù)據(jù)庫事務進行簡單的介紹。,需要的朋友可以參考下
    2021-05-05
  • MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    在使用MyBatis編寫Mapper XML時,有時會遇到比較操作符需要進行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Java?Mybatis的初始化之Mapper.xml映射文件的詳解

    Java?Mybatis的初始化之Mapper.xml映射文件的詳解

    這篇文章主要介紹了Java?Mybatis的初始化之Mapper.xml映射文件的詳解,解析完全局配置文件后接下來就是解析Mapper文件了,它是通過XMLMapperBuilder來進行解析的
    2022-08-08
  • SpringMVC中事務是否可以加在Controller層的問題

    SpringMVC中事務是否可以加在Controller層的問題

    這篇文章主要介紹了SpringMVC中事務是否可以加在Controller層的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java工廠模式定義與用法實例分析

    Java工廠模式定義與用法實例分析

    這篇文章主要介紹了Java工廠模式定義與用法,結(jié)合具體實例形式分析了java工廠模式定義、使用相關操作技巧,并總結(jié)了類圖原理,需要的朋友可以參考下
    2019-07-07
  • Java死鎖的產(chǎn)生原因及解決方法總結(jié)

    Java死鎖的產(chǎn)生原因及解決方法總結(jié)

    Java中的死鎖是指多個線程同時占用一些共享資源且彼此相互等待,從而導致所有的線程都被阻塞,不能繼續(xù)執(zhí)行程序的情況,本文小編給大家介紹了Java死鎖的產(chǎn)生原因及解決方法總結(jié),需要的朋友可以參考下
    2023-11-11
  • Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解

    Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解

    這篇文章主要介紹了Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解,ApplicationContext的refresh方法還是初始化了SimpleApplicationEventMulticaster,發(fā)送事件式還是先獲取ResolvableType類型,再獲取發(fā)送監(jiān)聽列表,需要的朋友可以參考下
    2023-12-12
  • 淺談Java中Spring Boot的優(yōu)勢

    淺談Java中Spring Boot的優(yōu)勢

    在本篇文章中小編給大家分析了Java中Spring Boot的優(yōu)勢以及相關知識點內(nèi)容,興趣的朋友們可以學習參考下。
    2018-09-09
  • Java的Semaphore信號量使用及原理解讀

    Java的Semaphore信號量使用及原理解讀

    這篇文章主要介紹了Java的Semaphore信號量使用及原理解讀,Semaphore(信號量)是Java中一個并發(fā)控制工具,用于控制對共享資源的訪問,它基于計數(shù)器的原理,可以限制同時訪問某個資源的線程數(shù)量,需要的朋友可以參考下
    2023-12-12
  • java hashtable實現(xiàn)代碼

    java hashtable實現(xiàn)代碼

    這篇文章介紹了java hashtable實現(xiàn)代碼,有需要的朋友可以參考一下
    2013-10-10

最新評論