Optional的stream方法,flatMap, filter應用

Java 8引入的OptionalStream徹底改變了我們處理空值和集合操作的方式。本文將深入探討如何將二者結合使用,通過四個核心場景提升代碼的健壯性和簡潔性。

一、Optional構成的Stream:空值自動過濾

當處理Optional集合時,我們常需要過濾掉空值并提取有效元素:

List<Optional<String>> options = Arrays.asList(Optional.of("Java"),Optional.empty(),Optional.of("Python")
);// 傳統方式
List<String> values = options.stream().filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());// 更優雅方式
List<String> improved = options.stream().flatMap(Optional::stream)  // Java 9+.collect(Collectors.toList());

flatMap(Optional::stream)會自動展開非空Optional,等價于:

.flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))

二、安全解引用:默認值策略

避免直接使用get(),優先考慮安全解引用方式:

Optional<User> userOpt = findUserById(123);// 不安全方式(可能拋出NoSuchElementException)
User risky = userOpt.get();// 安全方式1:提供默認值
User safeUser = userOpt.orElse(new User("Guest"));// 安全方式2:延遲計算默認值
User efficientUser = userOpt.orElseGet(() -> createGuestUser());or與orElseGet方法很像,or不會解包Optional對象的值,,這一方法 9引入,不會執行其它操作,直接返回Optional對象;如果原始Optional對象為空,該方法會延遲返回一個不同的Optional對象。orElseThrow和get方法相似, Optional對象為空拋出一個異常,orElseThrow可以定制希望拋出的異常。// 安全方式3:條件消費
userOpt.ifPresentOrElse(user -> processUser(user),() -> log.warn("User not found")
);

三、Optional組合運算:安全的值組合

當需要組合多個Optional值時,可采用函數式組合:

Optional<Integer> width = Optional.of(1920);
Optional<Integer> height = Optional.of(1080);// 方式1:嵌套map(Java 8)
Optional<Resolution> res = width.flatMap(w -> height.map(h -> new Resolution(w, h))
);// 方式2:使用Tuple包裝(更靈活)
record Tuple2<A,B>(A a, B b) {}
Optional<Tuple2<Integer, Integer>> dimensions = width.flatMap(w ->height.map(h -> new Tuple2<>(w, h))
);// 方式3:自定義zip方法
public static <A,B> Optional<Pair<A,B>> zip(Optional<A> a, Optional<B> b) {return a.flatMap(aVal -> b.map(bVal -> Pair.of(aVal, bVal)));
}

四、精準過濾:Optional.filter應用

在值提取前進行條件過濾:

Optional<String> emailOpt = getEmailFromRequest();// 基礎過濾:非空且包含@
Optional<String> validEmail = emailOpt.filter(e -> e.contains("@"));// 組合條件過濾
Optional<Employee> manager = findEmployee(id).filter(emp -> emp.getRole().equals(Role.MANAGER)).filter(emp -> emp.getProjects().size() > 3);// 鏈式操作示例
String result = Optional.ofNullable(rawInput).filter(s -> !s.isBlank()).map(String::trim).filter(s -> s.length() >= 6).orElse("default");

最佳實踐總結

  1. 防御性編程:始終假設Optional可能為空
  2. 早過濾原則:優先在Stream管道起始處處理空值
  3. 避免嵌套地獄:通過flatMap保持代碼扁平化
  4. 語義明確:使用orElse/orElseGet明確表達空值處理策略
  5. 不變性原則:Optional應始終視為不可變容器

通過合理運用這些模式,可以使代碼:

  • 減少90%以上的NullPointerException
  • 提高業務邏輯的可讀性
  • 增強數據流處理的健壯性
  • 降低維護復雜度

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

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

相關文章

參加李繼剛線下活動啟發:未來提示詞還會存在嗎?

上周六&#xff0c;我參加了李繼剛老師組織的線下活動。 現場干貨滿滿&#xff0c;尤其是關于 AI 時代提示詞的價值、與 AI 溝通的藝術等話題&#xff0c;李老師的分享如同醍醐灌頂&#xff0c;讓我對 AI 人機協作有了更深的理解。 將幾點核心收獲整理出來&#xff0c;與大家…

Python基礎知識第二天:從格式化到流程控制

Python基礎知識第二天&#xff1a;從格式化到流程控制 大家好&#xff01;今天我們來梳理Python的一些重要基礎知識&#xff0c;包括格式化輸出、輸入函數、運算符以及流程控制語句。 1. 格式化輸出 Python提供了多種格式化輸出的方式&#xff1a; # %d, %f, %s 格式化name &q…

GDB: coredump

前言&#xff1a;一句話如下使用 gdb [exec_file] [core_file] # or gdb -c [core_file] [exec_file] #-c指定轉儲的core文件 gdb -c core.5213 spp_uc_frequent_contact_ol_worker # 進入后輸入bt查看調用棧 bt #顯示所有幀棧 bt 10 #顯示前面10個幀棧(感覺沒啥用) bt …

21_js正則_表單驗證

目錄 正則 一、 正則的概念 二、創建正則方式 2.1 構造函數去創建正則 2.2 字面量去創建正則 2,3 test方法 三、正則修飾符 四、 正則的方法 lastIndex test方法 exec 五、字符串方法 replace match search split 六、正則表達式的構成 元字符-- 定位符 元字…

礦山自動化監測解決方案

1.行業現狀 為貫徹落實《中共中央國務院關于推進安全生產領域改革發展的意見》《“十四五”礦山安全生產規劃》&#xff08;應急〔2022〕64號&#xff09;、《國務院安委會辦公室關于加強礦山安全生產工作的緊急通知》&#xff08;安委辦〔2021〕3號&#xff09;等有關工作部署…

企業級知識庫建設:自建與開源產品集成的全景解析 —— 產品經理、CTO 與 CDO 的深度對話

文章目錄 一、引言二、主流產品與方案對比表三、自建方案 vs. 開源產品集成&#xff1a;技術路徑對比3.1 自建方案3.2 開源產品集成方案 四、結論與個人觀點 一、引言 在當今數據驅動的商業環境中&#xff0c;構建高質量的知識庫已成為企業數字化轉型的關鍵一環。本博客分別從…

【藍橋杯】單片機設計與開發,溫度傳感器DS18B20

一、溫度傳感器概述 結構圖 二、通信過程 三、onewire單總線協議概述 四、單總線的工作原理 黑粗線是單片機發送的&#xff0c;淺的是s18b20回應的 五、溫度傳感器的應用 六、onewire 七、課后習題

Python 在Word中查找并替換文本

在操作Word文檔時&#xff0c;如果想要修正一處反復出現的拼寫錯誤&#xff0c;統一文中前后不一致的術語&#xff0c;或者將文檔中所有的舊聯系方式更新為新號碼。這時我們可以使用 Word中的查找替換功能&#xff0c;快速定位并批量處理文檔中的特定文本&#xff0c;提升編輯效…

Python 筆記 (二)

Python Note 2 1. Python 慢的原因2. 三個元素3. 標準數據類型4. 字符串5. 比較大小: 富比較方法 rich comparison6. 數據容器 (支持*混裝* )一、允許重復類 (list、tuple、str)二、不允許重復類 (set、dict)1、集合(set)2、字典(dict)3、特殊: 雙端隊列 deque 三、數據容器的共…

kill子進程后再wait可以嗎?

在父進程中先使用 kill 函數終止子進程&#xff0c;之后再使用 wait 函數是可行的&#xff0c;下面從原理、使用示例、注意事項幾個方面詳細說明。 原理 kill 函數&#xff1a;其作用是向指定進程發送信號。當向子進程發送 SIGTERM&#xff08;通常用于請求進程正常終止&…

ai-api-union項目,適配各AI廠商api

項目地址&#xff1a;alpbeta/ai-api-union 需求&#xff1a;實現兼容各大模型廠商api的流式對話和同步對話接口&#xff0c;本項目現兼容智譜、豆包、通義、通義版deepseek 設計 一個ChatController類對外暴露這兩個接口&#xff0c;入參都為ChatRequest請求類&#xff0c;…

【QT】QT樣式設計

QT樣式設計 一、QT工程中添加資源文件1.資源文件&#xff1a;2. 添加步驟&#xff1a;3. 新增資源文件以及刪除現有的資源文件4. 使用資源文件 二、QT中的qss語句(樣式設計語句)1. 樣式設計2.常見的qss語句示例代碼&#xff1a; 一、QT工程中添加資源文件 1.資源文件&#xff…

Megatron-LM中的deepseek-v3實現

Megatron-LM&#xff1a;https://github.com/NVIDIA/Megatron-LM/tree/main 使用此倉庫構建的著名的庫也有很多&#xff0c;如: Colossal-AI, HuggingFace Accelerate, and NVIDIA NeMo Framework.Pai-Megatron-Patch工具是阿里人工智能平臺PAI算法團隊研發,ai-Megatron-Patch…

[mlr3] Bootstrap與交叉驗證k-fold cross validation

五折交叉驗證因其無放回分層抽樣和重復驗證機制&#xff0c;成為超參數調優的首選&#xff1b; 而Bootstrap因有放回抽樣的重復性和驗證集的不穩定性&#xff0c;主要服務于參數估計&#xff08;置信區間的計算&#xff09;而非調優。 實際應用中&#xff0c;可結合兩者優勢&am…

某大麥手機端-搶票

引言 僅供學習研究&#xff0c;歡迎交流 搶票難&#xff0c;難于上青天&#xff01;無論是演唱會、話劇還是體育賽事&#xff0c;大麥網的票總是秒光。作為一名技術愛好者&#xff0c;你是否想過用技術手段提高搶票成功率&#xff1f;本文將為你揭秘大麥手機端搶票的核心技術…

最常使用的現代C++新特性介紹

現代 C泛指的是從 C11 之后的 C標準. 從 C11 開始, C標準委員會實行班車制, 沒三年發布一個新版本, 如果一個功能在新版本發布之前已經準備好, 則可以加入該版本中, 否則延后到下一個版本. 語言核心 自 C11 開始, 語言語法層面加了許多語法糖, 還有增加了一些新語法.使得 C語…

SQL Server:當在刪除數據庫時因為存在觸發器而無法刪除

當在刪除數據庫時因為存在觸發器而無法刪除&#xff0c;你可以通過禁用觸發器來解決這個問題。下面為你介紹在 SQL Server 里禁用和啟用觸發器的方法。 禁用數據庫中所有表的觸發器 你可以使用系統視圖 sys.triggers 來查詢數據庫里所有的觸發器&#xff0c;然后生成禁用這些…

【Linux篇】進程入門指南:操作系統中的第一步

步入進程世界&#xff1a;初學者必懂的操作系統概念 一. 馮諾依曼體系結構1.1 背景與歷史1.2 組成部分1.3 意義 二. 進程2.1 進程概念2.1.1 PCB&#xff08;進程控制塊&#xff09; 2.2 查看進程2.2.1 使用系統文件查看2.2.2 使?top和ps這些??級?具來獲取2.2.3 通過系統調用…

銷售易vs紛享銷客:制造行業CRM選型深度解析

“以客戶為中心”&#xff0c;顧名思義就是指讓客戶貫穿企業市場、研發、生產、銷售、服務全流程&#xff0c;以客戶需求為導向進行經營。CRM作為企業數字化建設基礎設施&#xff0c;在企業高質量發展進程中扮演著重要角色。在眾多CRM解決方案中&#xff0c;騰訊旗下CRM銷售易憑…

【JavaScript】九、JS基礎練習

文章目錄 1、練習&#xff1a;對象數組的遍歷2、練習&#xff1a;猜數字3、練習&#xff1a;生成隨機顏色 1、練習&#xff1a;對象數組的遍歷 需求&#xff1a;定義多個對象&#xff0c;存數組&#xff0c;遍歷數據渲染生成表格 let students [{ name: 小明, age: 18, gend…