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

java中Optional的核心用法和最佳實踐

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

前言

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

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)若值存在返回該值,否則返回默認值。

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

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

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

3. 轉換與過濾 Optional 中的值

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

對 Optional 中的值進行轉換,返回新的 Optional。

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

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

用于處理嵌套的 Optional,避免嵌套結構。

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

3.3 filter(Predicate<? super T> predicate)

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

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

4. 鏈式操作示例

結合 map、filter 和 orElse 實現(xiàn)鏈式調用:

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

5. Optional 的最佳實踐

? 推薦做法

  • 方法返回值處理當方法可能返回 null 時,返回 Optional<T> 而不是 null。

    public Optional<User> findUserById(String id) {
        // ...
    }
    
  • 鏈式操作替代嵌套判斷用 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);
    
  • 提供默認值使用 orElse 或 orElseGet 處理缺失值。

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

?? 常見誤區(qū)

  • 不要用 Optional 聲明類字段Optional 不適合用作類的字段,因為序列化和反序列化可能存在問題。

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

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

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

6. Optional 與 Stream 的結合

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

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

7. 總結

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

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

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

相關文章

  • 詳解如何在SpringBoot中使用WebMvc

    詳解如何在SpringBoot中使用WebMvc

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

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

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

    spring boot整合Swagger2的示例代碼

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

    SpringCloud項目中集成Sentinel問題

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

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

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

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

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

    一文看懂Mybatis中的延遲加載

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

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

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

    分析ThreadLocal內存泄漏問題

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

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

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

最新評論