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

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)

根據(jù)條件過濾值,若條件不滿足,返回空的 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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java Swing實現(xiàn)簡單的體重指數(shù)(BMI)計算器功能示例

    Java Swing實現(xiàn)簡單的體重指數(shù)(BMI)計算器功能示例

    這篇文章主要介紹了Java Swing實現(xiàn)簡單的體重指數(shù)(BMI)計算器功能,涉及Java Swing窗口組件布局、響應及數(shù)值運算相關操作技巧,需要的朋友可以參考下
    2017-12-12
  • JavaEE線程安全定時器模式任務

    JavaEE線程安全定時器模式任務

    這篇文章主要介紹了JavaEE線程安全定時器模式任務,定時器模式像是一個鬧鐘定時,在一定時間之后被喚醒并執(zhí)行某個之前設定好的任務,感興趣的小伙伴可以參考一下
    2022-06-06
  • AgentScope?Java?入門到進階指南

    AgentScope?Java?入門到進階指南

    AgentScopeJava是一個面向智能體的編程框架,用于構建基于大語言模型的應用,它提供了智能體所需功能,本文給大家介紹AgentScope?Java?入門到進階,感興趣的朋友一起看看吧
    2026-04-04
  • Java實現(xiàn)的RSA加密解密算法示例

    Java實現(xiàn)的RSA加密解密算法示例

    這篇文章主要介紹了Java實現(xiàn)的RSA加密解密算法,結合實例形式分析了java RAS加密解密算法的相關實現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • spring boot實現(xiàn)圖片上傳和下載功能

    spring boot實現(xiàn)圖片上傳和下載功能

    這篇文章主要為大家詳細介紹了spring boot實現(xiàn)圖片上傳和下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • SpringBoot Knife4j在線API文檔框架基本使用

    SpringBoot Knife4j在線API文檔框架基本使用

    knife4j是為Java MVC框架集成Swagger生成Api文檔的增強解決方案,這篇文章主要介紹了SpringBoot中使用Knife4J在線API文檔框架,需要的朋友可以參考下
    2022-12-12
  • Java實現(xiàn)簡易俄羅斯方塊

    Java實現(xiàn)簡易俄羅斯方塊

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡易俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Java?詳細講解線程的狀態(tài)及部分常用方法

    Java?詳細講解線程的狀態(tài)及部分常用方法

    在Java程序中,一個線程對象只能調用一次start()方法啟動新線程,并在新線程中執(zhí)行run()方法。一旦run()方法執(zhí)行完畢,線程就結束了,本篇來講解Java線程的狀態(tài)以及部分常用方法
    2022-04-04
  • Spring之InitializingBean接口和DisposableBean接口的使用

    Spring之InitializingBean接口和DisposableBean接口的使用

    這篇文章主要介紹了Spring之InitializingBean接口和DisposableBean接口的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot+MyBatis集成微信支付實現(xiàn)示例

    SpringBoot+MyBatis集成微信支付實現(xiàn)示例

    本文主要介紹了SpringBoot+MyBatis集成微信支付實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06

最新評論

基隆市| 襄樊市| 横峰县| 桐乡市| 抚远县| 满洲里市| 阳春市| 新宾| 道真| 徐汇区| 镇雄县| 濉溪县| 定南县| 台北市| 海南省| 宁武县| 略阳县| 岫岩| 阿城市| 泽库县| 通山县| 富阳市| 望都县| 博罗县| 大理市| 金湖县| 大埔县| 黄平县| 开平市| 永靖县| 洛宁县| 龙游县| 台北市| 合山市| 南岸区| 临安市| 巴楚县| 临邑县| 溆浦县| 岑巩县| 岑溪市|