Java高頻面試之SE-22

hello啊,各位觀眾姥爺們!!!本baby今天又來了!哈哈哈哈哈嗝🐶

Java中的Optional了解多少?

在 Java 中,Optional 是 Java 8 引入的一個容器類,用于顯式處理可能為 null 的值,避免 NullPointerException(空指針異常)。它的核心思想是將“空值”包裝成一個對象,通過鏈式調用強制本baby顯式處理空值場景,提升代碼的可讀性和健壯性。


1. Optional 的核心設計

  • 不可變容器Optional 對象一旦創建,其內部的值不可修改。
  • 明確語義:通過方法名(如 isPresent()orElse())明確表達值的“存在性”和“默認值”邏輯。
  • 鏈式調用:支持函數式風格的鏈式操作(如 map()filter())。

2. 創建 Optional

方法描述
Optional.empty()創建一個空的 Optional 對象(值為 null)。
Optional.of(T)創建非空 Optional,若值為 null 會拋出 NullPointerException
Optional.ofNullable(T)創建 Optional,若值為 null,返回 Optional.empty()

示例

Optional<String> emptyOpt = Optional.empty(); 
Optional<String> nameOpt = Optional.of("葉文潔"); 
Optional<String> nullableOpt = Optional.ofNullable(getName()); // getName() 可能返回 null

3. 常用操作方法

(1) 檢查值是否存在
方法描述
isPresent()判斷值是否存在(非 null)。
isEmpty()判斷值是否為空(Java 11+)。

示例

if (nameOpt.isPresent()) {System.out.println("Name: " + nameOpt.get());
}
(2) 獲取值
方法描述
get()直接獲取值,若值為 null 拋出 NoSuchElementException不推薦直接使用
orElse(T)值存在時返回值,否則返回默認值。
orElseGet(Supplier)值存在時返回值,否則通過 Supplier 生成默認值(延遲計算)。
orElseThrow()值存在時返回值,否則拋出指定異常(Java 10+)。

示例

String name1 = nameOpt.orElse("Unknown"); // 默認值
String name2 = nameOpt.orElseGet(() -> fetchDefaultName()); // 延遲計算
String name3 = nameOpt.orElseThrow(() -> new IllegalStateException("Name not found"));
(3) 鏈式操作
方法描述
map(Function)對值進行轉換,若值為空,返回 Optional.empty()
flatMap(Function)類似 map,但 Function 需返回 Optional,避免嵌套 Optional
filter(Predicate)過濾值,若條件不滿足,返回 Optional.empty()

示例

Optional<User> userOpt = Optional.ofNullable(user);
String email = userOpt.map(User::getAddress).map(Address::getEmail).orElse("no-email@luoji.com");

4. 使用場景與最佳實踐

(1) 適用場景
  • 返回值可能為 null 的方法
    public Optional<User> findUserById(int id) {// 如果找不到,返回 Optional.empty()
    }
    
  • 鏈式處理嵌套對象:避免深層 if (obj != null) 檢查。
  • 顯式表達“空值”語義:強制調用方處理可能的空值。
(2) 避免的陷阱
  • 不要濫用 Optional

    • 不要用 Optional 作為方法參數或類的字段(違反設計初衷)。
    • 不要用 Optional 代替集合(如 Optional<List> 應直接用空集合 Collections.emptyList())。
  • 避免 isPresent() + get() 組合

    // 不推薦:
    if (opt.isPresent()) {String value = opt.get();
    }// 推薦:
    opt.ifPresent(value -> {...});
    

5. Java 9+ 的增強

Java 9 對 Optional 進行了擴展,新增方法:

方法描述
ifPresentOrElse()值存在時執行一個操作,否則執行另一個操作。
or()值存在時返回當前 Optional,否則返回另一個 Optional
stream()Optional 轉換為 Stream

示例

nameOpt.ifPresentOrElse(name -> System.out.println("Name: " + name),() -> System.out.println("Name not found")
);

🐮🐎

  • Optional 的核心價值是強制開發者顯式處理空值,減少 NullPointerException
  • 推薦鏈式操作(如 map()flatMap())代替直接檢查 isPresent()
  • 避免濫用,僅用于方法返回值,而非參數或字段。
  • Java 9+ 提供更豐富的鏈式操作(如 ifPresentOrElse())。

正確使用 Optional 可以讓代碼更簡潔、安全,但需結合場景合理選擇其與傳統的 null 檢查。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895693.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用OBS和nginx實現直播流

使用OBS和nginx實現直播流&#xff0c;如 1&#xff0c;下載OBS OBS用于視頻錄制和直播的免費開源軟件。在 Windows、Mac 或 Linux 上快速輕松地下載并開始流式傳輸。官網下載 2&#xff0c;下載nginx 注意nginx需要下載帶gryghon版本&#xff0c;這個才有rtmp模塊&#xff0…

PyTorch 源碼學習:閱讀經驗 代碼結構

分享自己在學習 PyTorch 源碼時閱讀過的資料。本文重點關注閱讀 PyTorch 源碼的經驗和 PyTorch 的代碼結構。因為 PyTorch 不同版本的源碼實現有所不同&#xff0c;所以筆者在整理資料時盡可能按版本號升序&#xff0c;版本號見標題前[]。最新版本的源碼實現還請查看 PyTorch 倉…

python實現jaccard系數得出兩個集合的相似度

python實現jaccard系數得出兩個集合的相似度 1、簡介 計算兩個集合之間的Jaccard系數是一種常用的方法,用于衡量這兩個集合的相似度。 Jaccard系數定義為兩個集合交集大小與它們并集大小的比值。 Jaccard 系數的值范圍在 0 到 1 之間,值越大表示兩個集合越相似。 2、求兩個…

小愛音箱控制手機和電視聽歌的嘗試

最近買了小愛音箱pro&#xff0c;老婆讓我扔了&#xff0c;吃灰多年的舊音箱。當然舍不得&#xff0c;比小愛還貴&#xff0c;剛好還有一臺紅米手機&#xff0c;能插音箱&#xff0c;為了讓音箱更加靈活&#xff0c;買了個2元的藍牙接收模塊Type-c供電3.5接口。這就是本次嘗試起…

Pycharm+CodeGPT+Ollama+Deepseek

首先&#xff0c;體驗截圖&#xff1a; 接著&#xff1a; 1、下載Ollama&#xff1a; Download Ollama on macOS 2、下載模型 以1.5b為例&#xff0c;打開命令行&#xff0c;輸入: ollama run deepseek-r1:1.5b 3、Pycharm安裝Code GPT插件 打開PyCharm&#xff0c;找到文…

如何確保 for...in 循環按照特定順序遍歷對象屬性

由于 for...in 循環遍歷對象屬性的順序在 ECMAScript 規范中沒有嚴格規定&#xff0c;若要確保按照特定順序遍歷對象屬性&#xff0c;不能直接依賴 for...in 本身&#xff0c;不過可以借助一些其他方法來實現。以下是幾種常見的解決方案&#xff1a; 1. 使用數組存儲屬性名并排…

25/2/17 <嵌入式筆記> 桌寵代碼解析

這個寒假跟著做了一個開源的桌寵&#xff0c;我們來解析下代碼&#xff0c;加深理解。 代碼中有開源作者的名字。可以去B站搜著跟著做。 首先看下main代碼 #include "stm32f10x.h" // Device header #include "Delay.h" #include &quo…

Qt中基于開源庫QRencode生成二維碼(附工程源碼鏈接)

目錄 1.QRencode簡介 2.編譯qrencode 3.在Qt中直接使用QRencode源碼 3.1.添加源碼 3.2.用字符串生成二維碼 3.3.用二進制數據生成二維碼 3.4.界面設計 3.5.效果展示 4.注意事項 5.源碼下載 1.QRencode簡介 QRencode是一個開源的庫&#xff0c;專門用于生成二維碼&…

【Android開發】華為手機安裝包安裝失敗“應用是非正式版發布版本,當前設備不支持安裝”問題解決

問題描述 我們將Debug版本的安裝包發送到手機上安裝&#xff0c;會發現華為手機有如下情況 解決辦法 在文件gradle.properties中粘貼代碼&#xff1a; android.injected.testOnlyfalse 最后點擊“Sync now”&#xff0c;等待重新加載gradle資源即可 后面我們重新編譯Debug安裝…

前端面試手寫--虛擬列表

目錄 一.問題背景 二.代碼講解 三.代碼改裝 四.代碼發布 今天我們來學習如何手寫一個虛擬列表,本文將把虛擬列表進行拆分并講解,然后發布到npm網站上. 一.問題背景 為什么需要虛擬列表呢?這是因為在面對大量數據的時候,我們的瀏覽器會將所有數據都渲染到表格上面,但是渲…

vue項目本地svg圖標使用

提前準備&#xff1a; 1、一個本地的svg圖片 這個直接從網上找一個就行 2、文件整體目錄 安裝插件 npm i vite-plugin-svg-iconsvite.config.ts中配置插件 完整代碼 import { fileURLToPath, URL } from node:url import { resolve } from path import { defineConfig } f…

Go: 使用VS Code配置Go項目支持Windows與Linux雙系統調試

在現代軟件開發中&#xff0c;越來越多的開發者開始使用VS Code等集成開發環境&#xff08;IDE&#xff09;來提高生產力&#xff0c;特別是在支持遠程開發時。VS Code的遠程SSH功能&#xff0c;使得開發者可以在本地Windows電腦上&#xff0c;通過遠程SSH連接到Linux服務器&am…

萌新學 Python 之集合 set

集合 set&#xff1a;使用一對大括號&#xff0c;元素寫在大括號之間&#xff0c;使用逗號分隔 集合中的元素只能是不可變的數據類型&#xff0c;不能是列表、字典和集合 set1 {1, 2, 3} set2 {1, a, (1, 2, 3)} print(type(set1), type(set2)) # <class set> <c…

python中使用數據庫sqlite3

Python使用sqlite3數據庫 python3.x標準庫內置了SQLite3 查看sqlite的版本 import sqlite3 sqlite_version sqlite3.sqlite_version print(f"SQLite version: {sqlite_version}") 顯示 導入模塊連接sqlitte3 import sqlite3 consqlite3.connect("d:/fi…

maven使用默認settings.xml配置時,Idea基于pom.xml更新依賴時報錯,有些組件下載時連接超時

1、問題背景&#xff1a;maven使用默認settings.xml配置時&#xff0c;Idea基于pom.xml更新依賴時報錯&#xff0c;有些組件下載時連接超時&#xff0c; 通過日志發下&#xff0c;去連接maven.org網站下載依賴&#xff0c;有時候肯定會超時。 2、解決辦法&#xff1a;使用國外…

小狐貍ai3.1.2版本源碼無授權版本內 含搭建教程+各種上線教程

內容目錄 一、詳細介紹小狐貍3.1.2版本源碼&#xff0c;新增deepseek接口 文件夾說明&#xff1a; 1、后端&#xff1a;文件夾是后臺文件 5、.sql文件是數據庫文件后臺安裝步驟&#xff1a; 1、在寶塔新建個站點&#xff0c;php版本使用7.4&#xff0c;將“后端”文件夾里的文件…

C#之上位機開發---------C#通信庫及WPF的簡單實踐

〇、上位機&#xff0c;分層架構 界面層 要實現的功能&#xff1a; 展示數據 獲取數據 發送數據 數據層 要實現的功能&#xff1a; 轉換數據 打包數據 存取數據 通信層 要實現的功能&#xff1a; 打開連接 關閉連接 讀取數據 寫入數據 實體類 作用&#xff1a; 封裝數據…

Python Django 入門教程

Django 構建一個完整的博客平臺,包含用戶認證、評論、權限控制等功能。 環境搭建 安裝依賴 先確保已經安裝了 Python 環境,并通過 pip 安裝 Django 及其它依賴: pip install django pip install djangorestframework創建項目和應用 創建一個 Django 項目并進入該項目目錄:…

今日行情明日機會——20250217

2025年02月17日行情 后續投資機會分析 根據最新盤面信息&#xff0c;以下板塊和個股具備潛在投資機會&#xff0c;需結合市場動態和基本面進一步驗證&#xff1a; 1. 騰訊系AI&#xff08;18家漲停&#xff09; 核心邏輯&#xff1a;漲停家數最多&#xff08;18家&#xff0…

常見的IP地址分配方式有幾種:深入剖析與適用場景?

在數字互聯的世界里&#xff0c;IP地址如同網絡世界的“門牌號”&#xff0c;是設備間通信的基礎。隨著網絡技術的飛速發展&#xff0c;IP地址的分配方式也日趨多樣化&#xff0c;以適應不同規模、不同需求的網絡環境。本文將深入探討當前主流的幾種IP地址分配方式&#xff0c;…