亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中Optional的核心用法和最佳實(shí)踐

 更新時間:2025年06月06日 11:50:03   作者:@zcc@  
Java8中Optional用于處理可能為null的值,減少空指針異常,這篇文章主要介紹了java中Optional核心用法和最佳實(shí)踐的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 Java 8 中,Optional 是一個用于處理可能為 null 的值的容器類,旨在減少空指針異常(NullPointerException)并提升代碼的可讀性。以下是 Optional 的核心用法和最佳實(shí)踐:

1. 創(chuàng)建 Optional 對象

1.1 常規(guī)創(chuàng)建方式

  • Optional.of(T value)創(chuàng)建一個包含非空值的 Optional。如果傳入 null,會拋出 NullPointerException。

    Optional<String> name = Optional.of("Alice");
    
  • Optional.ofNullable(T value)允許傳入 null,若值為 null,返回空的 Optional。

    Optional<String> nullableName = Optional.ofNullable(getName()); // 若 getName() 返回 null,nullableName 為空
    
  • Optional.empty()創(chuàng)建一個空的 Optional。

    Optional<String> empty = Optional.empty();
    

2. 訪問 Optional 中的值

2.1 檢查值是否存在

  • isPresent()判斷 Optional 是否包含值。

    if (name.isPresent()) {
        System.out.println("值存在: " + name.get());
    }
    
  • ifPresent(Consumer<? super T> consumer)如果值存在,執(zhí)行傳入的操作。

    name.ifPresent(n -> System.out.println("值存在: " + n));
    
  • isEmpty()(Java 11+)判斷 Optional 是否為空。

    if (empty.isEmpty()) {
        System.out.println("Optional 為空");
    }
    

2.2 安全獲取值

  • get()直接獲取值,但需確保值存在(否則拋出 NoSuchElementException)。

    String result = name.get(); // 若 name 為空,拋出異常
    
  • orElse(T other)若值存在返回該值,否則返回默認(rèn)值。

    String defaultName = nullableName.orElse("Default Name");
    
  • orElseGet(Supplier<? extends T> supplier)與 orElse() 類似,但默認(rèn)值由 Supplier 延遲生成。

    String generatedName = nullableName.orElseGet(() -> "Generated Name");
    
  • orElseThrow(Supplier<? extends X> exceptionSupplier)若值不存在,拋出指定異常。

    String actualName = nullableName.orElseThrow(() -> new IllegalArgumentException("值不存在"));
    

3. 轉(zhuǎn)換與過濾 Optional 中的值

3.1 map(Function<? super T, ? extends U> mapper)

對 Optional 中的值進(jìn)行轉(zhuǎn)換,返回新的 Optional。

Optional<String> upperCaseName = name.map(String::toUpperCase);
upperCaseName.ifPresent(System.out::println); // 輸出: ALICE

3.2 flatMap(Function<? super T, Optional<U>> mapper)

用于處理嵌套的 Optional,避免嵌套結(jié)構(gòu)。

Optional<Optional<String>> nested = Optional.of(name);
Optional<String> flattened = nested.flatMap(o -> o); // 展平為 Optional<String>

3.3 filter(Predicate<? super T> predicate)

根據(jù)條件過濾值,若條件不滿足,返回空的 Optional。

Optional<String> longName = name.filter(n -> n.length() > 5);
longName.ifPresent(System.out::println); // 若 name 為 "Alice"(長度 5),不輸出

4. 鏈?zhǔn)讲僮魇纠?/h2>

結(jié)合 map、filter 和 orElse 實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用:

Optional<User> user = getUser();
String city = user
    .map(User::getAddress)
    .map(Address::getCity)
    .orElse("Unknown City");
System.out.println("城市: " + city);

5. Optional 的最佳實(shí)踐

? 推薦做法

  • 方法返回值處理當(dāng)方法可能返回 null 時,返回 Optional<T> 而不是 null

    public Optional<User> findUserById(String id) {
        // ...
    }
    
  • 鏈?zhǔn)讲僮魈娲短着袛?/strong>用 map 和 flatMap 替代多層 if-else。

    // 傳統(tǒng)方式
    User user = getUser();
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            System.out.println(address.getCity());
        }
    }
    
    // 使用 Optional
    Optional.ofNullable(user)
        .map(User::getAddress)
        .map(Address::getCity)
        .ifPresent(System.out::println);
    
  • 提供默認(rèn)值使用 orElse 或 orElseGet 處理缺失值。

    String name = Optional.ofNullable(user).map(User::getName).orElse("Guest");
    

?? 常見誤區(qū)

  • 不要用 Optional 聲明類字段Optional 不適合用作類的字段,因?yàn)樾蛄谢头葱蛄谢赡艽嬖趩栴}。

    // ? 不推薦
    private Optional&lt;String&gt; name;
    
  • 避免濫用 get()直接調(diào)用 get() 前必須檢查值是否存在。

    // ? 錯誤
    String name = optional.get(); 
    
    // ? 正確
    String name = optional.orElseThrow(() -> new RuntimeException("值不存在"));
    
  • 不要過度使用 Optional僅在明確“值可能缺失”的場景使用,避免過度設(shè)計。

    // ? 不推薦
    public Optional<String> getName() { ... }
    
    // ? 推薦
    public String getName() { return Optional.ofNullable(...).orElse(""); }
    

6. Optional 與 Stream 的結(jié)合

Optional 可以與 Stream 結(jié)合使用,處理集合中的空值:

List<Optional<String>> optionalNames = ...;
List<String> names = optionalNames.stream()
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());

7. 總結(jié)

方法用途示例
of創(chuàng)建非空的 OptionalOptional.of("Hello")
ofNullable創(chuàng)建允許為 null 的 OptionalOptional.ofNullable(getName())
isPresent檢查值是否存在optional.isPresent()
ifPresent若存在則執(zhí)行操作optional.ifPresent(System.out::println)
orElse提供默認(rèn)值optional.orElse("Default")
map轉(zhuǎn)換值optional.map(String::toUpperCase)
flatMap展平嵌套的 Optionaloptional.flatMap(o -> o)
filter過濾值optional.filter(s -> s.length() > 5)
orElseThrow若無值則拋出異常optional.orElseThrow(() -> new RuntimeException("無值"))

通過合理使用 Optional,可以顯著減少空指針異常的風(fēng)險,同時使代碼更簡潔、意圖更明確。

到此這篇關(guān)于java中Optional的核心用法和最佳實(shí)踐的文章就介紹到這了,更多相關(guān)java中Optional詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何在SpringBoot中使用WebMvc

    詳解如何在SpringBoot中使用WebMvc

    Spring?Boot?是一個快速、簡單的開發(fā)框架,在?Spring?Boot?中,我們可以使用?WebMvc?來構(gòu)建?Web?應(yīng)用程序,所以本文就來講講如何在SpringBoot中使用WebMvc吧
    2023-06-06
  • Spring?Boot?使用觀察者模式實(shí)現(xiàn)實(shí)時庫存管理的步驟

    Spring?Boot?使用觀察者模式實(shí)現(xiàn)實(shí)時庫存管理的步驟

    在現(xiàn)代軟件開發(fā)中,實(shí)時數(shù)據(jù)處理非常關(guān)鍵,本文提供了一個使用SpringBoot和觀察者模式開發(fā)實(shí)時庫存管理系統(tǒng)的詳細(xì)教程,步驟包括創(chuàng)建項(xiàng)目、定義實(shí)體類、實(shí)現(xiàn)觀察者模式、集成Spring框架、創(chuàng)建RESTful?API端點(diǎn)和測試應(yīng)用等,這將有助于開發(fā)者構(gòu)建能夠即時響應(yīng)庫存變化的系統(tǒng)
    2024-09-09
  • spring boot整合Swagger2的示例代碼

    spring boot整合Swagger2的示例代碼

    Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化RESTful風(fēng)格的 Web 服務(wù)。這篇文章主要介紹了spring boot整合Swagger2,需要的朋友可以參考下
    2017-04-04
  • SpringCloud項(xiàng)目中集成Sentinel問題

    SpringCloud項(xiàng)目中集成Sentinel問題

    在SpringCloud項(xiàng)目中集成Sentinel,可以實(shí)現(xiàn)流量控制、熔斷降級等功能,提升系統(tǒng)穩(wěn)定性和可用性,集成步驟包括添加Sentinel依賴、配置控制臺地址、啟動控制臺、配置限流熔斷規(guī)則、使用注解和集成SpringCloudGateway,這有助于處理高并發(fā)場景,保護(hù)服務(wù)穩(wěn)定運(yùn)行
    2024-10-10
  • Java實(shí)現(xiàn)的KNN算法示例

    Java實(shí)現(xiàn)的KNN算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的KNN算法,結(jié)合實(shí)例形式分析了KNN算法的原理及Java定義與使用KNN算法流程、訓(xùn)練數(shù)據(jù)相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Java中輸入單個char類型的字符方式

    Java中輸入單個char類型的字符方式

    這篇文章主要介紹了Java中輸入單個char類型的字符方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 一文看懂Mybatis中的延遲加載

    一文看懂Mybatis中的延遲加載

    這篇文章主要介紹了一文看懂Mybatis中的延遲加載,延遲加載也稱為懶加載,是指在進(jìn)行表的關(guān)聯(lián)查詢時,按照設(shè)置延遲規(guī)則推遲對關(guān)聯(lián)對象的select查詢,MyBatis 的延遲加載只是對關(guān)聯(lián)對象的查詢有遲延設(shè)置,對于主加載對象都是直接執(zhí)行查詢語句的,需要的朋友可以參考下
    2023-10-10
  • 通過java備份恢復(fù)mysql數(shù)據(jù)庫的實(shí)現(xiàn)代碼

    通過java備份恢復(fù)mysql數(shù)據(jù)庫的實(shí)現(xiàn)代碼

    這篇文章主要介紹了如何通過java備份恢復(fù)mysql數(shù)據(jù)庫,其實(shí)一般情況下通過bat或sh就可以,這里主要是介紹了java的實(shí)現(xiàn)思路,喜歡的朋友可以參考下
    2013-09-09
  • 分析ThreadLocal內(nèi)存泄漏問題

    分析ThreadLocal內(nèi)存泄漏問題

    ThreadLocal的作用是提供線程內(nèi)的局部變量,這種變量在線程生命周期內(nèi)起作用,減少同一個線程內(nèi)多個函數(shù)或者組件之間一些公共變量傳遞的復(fù)雜度,但是如果濫用ThreadLocal可能會導(dǎo)致內(nèi)存泄漏,所以本文將為大家分析ThreadLocal內(nèi)存泄漏問題
    2023-07-07
  • SpringBoot項(xiàng)目中如何實(shí)現(xiàn)MySQL讀寫分離詳解

    SpringBoot項(xiàng)目中如何實(shí)現(xiàn)MySQL讀寫分離詳解

    在高并發(fā)下需要對應(yīng)用進(jìn)行讀寫分離,配置多數(shù)據(jù)源,即寫操作走主庫,讀操作則走從庫,主從數(shù)據(jù)庫負(fù)責(zé)各自的讀和寫,緩解了鎖的爭用,提高了讀取性能,這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目中如何實(shí)現(xiàn)MySQL讀寫分離的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評論