java8 stream流操作的flatMap

我們來詳細解釋一下 Java 8 Stream API 中的?flatMap?操作。理解?flatMap?的關鍵在于將其與?map?操作進行對比。

??核心概念:??

  1. ??map?操作:??

    • 作用:將一個流中的每個元素??轉換??為另一個元素(類型可以不同)。
    • 輸入:一個元素?T
    • 輸出:一個元素?R?(通過你提供的?Function<T, R>?函數)
    • 結果流:一個包含所有轉換后元素?R?的流?Stream<R>
    • ??特點:?? 輸入一個元素,輸出一個元素。輸入流中有 N 個元素,輸出流中也有 N 個元素(類型可能變了)。
  2. ??flatMap?操作:??

    • 作用:將一個流中的每個元素??轉換??為??零個、一個或多個新元素組成的流??,然后將所有這些生成的流??“扁平化”?? 連接成一個單一的流。
    • 輸入:一個元素?T
    • 輸出:一個流?Stream<R>?(通過你提供的?Function<T, Stream<R>>?函數)
    • 結果流:將每個輸入元素?T?產生的?Stream<R>?中的所有元素??連接(展平)?? 起來形成的最終?Stream<R>
    • ??特點:??
      • 輸入一個元素,輸出一個??流??(包含零個、一個或多個元素)。
      • 然后將所有輸出的流“拍扁”,合并成一個單一的流。
      • 輸入流中有 N 個元素,輸出流中的元素個數可以是 0 到 M(M 是所有生成的流中元素的總和)。元素類型通常也會改變。

??為什么叫 “flatMap”???

  • ??Map:?? 因為它像?map?一樣,對每個元素應用一個轉換函數。
  • ??Flat:?? 因為它將轉換后產生的??嵌套結構(流中的流)?? “展平”(flatten)成一個單一的流。

??核心函數式接口:??

  • map?使用?Function<T, R>:?R apply(T t)
  • flatMap?使用?Function<T, Stream<R>>:?Stream<R> apply(T t)?— ??注意返回值必須是?Stream!??

??常見使用場景:??

  1. ??展平嵌套集合:?? 這是最經典的用法。

    List<List<String>> nestedList = Arrays.asList(Arrays.asList("a", "b", "c"),Arrays.asList("d", "e"),Arrays.asList("f", "g", "h")
    );// 使用 map: 得到一個包含3個流的流 (Stream<Stream<String>>)
    Stream<Stream<String>> streamOfStreams = nestedList.stream().map(list -> list.stream());// 使用 flatMap: 得到一個包含所有字符串的單一流 (Stream<String>)
    Stream<String> flatStream = nestedList.stream().flatMap(list -> list.stream());List<String> flattenedList = flatStream.collect(Collectors.toList());
    // flattenedList 結果為: ["a", "b", "c", "d", "e", "f", "g", "h"]
  2. 處理可能產生多個結果的元素:?? 例如,一個字符串數組,你想把每個字符串按空格分割成單詞。
    List<String> lines = Arrays.asList("Hello world", "Java 8 Streams", "flatMap example");// 使用 map + split: 得到一個包含字符串數組的流 (Stream<String[]>)
    Stream<String[]> streamOfArrays = lines.stream().map(line -> line.split(" "));// 使用 flatMap + Arrays.stream(): 得到一個包含所有單詞的單一流 (Stream<String>)
    Stream<String> wordsStream = lines.stream().flatMap(line -> Arrays.stream(line.split(" ")));List<String> words = wordsStream.collect(Collectors.toList());
    // words 結果為: ["Hello", "world", "Java", "8", "Streams", "flatMap", "example"]

總結?flatMap:??

  • ??目的:?? 處理那些一個輸入元素會映射到??多個輸出元素??(或者需要表示為流)的場景,并將這些輸出??平滑地合并??到最終的結果流中。
  • ??關鍵:?? 你提供給?flatMap?的函數 (Function<T, Stream<R>>) ??必須返回一個?Stream?對象??。
  • ??結果:?? 將輸入流中每個元素產生的所有?Stream<R>?的內容連接起來,形成一個單一的、連續的?Stream<R>
  • ??效果:?? “展平”嵌套結構或一對多映射。

簡單來說,當你遇到類似“我有一個列表,里面的每個元素本身又是一個列表(或其他集合),我想把它們合并成一個大列表”或者“我有一個流,每個元素處理后會得到一組結果,我想把這些結果都收集到一個流里”的情況時,flatMap?就是你的好幫手。

?

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

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

相關文章

開源UI生態掘金:從Ant Design二次開發到行業專屬組件的技術變現

開源UI生態掘金&#xff1a;從Ant Design二次開發到行業專屬組件的技術變現內容摘要在開源UI生態中&#xff0c;Ant Design作為一款廣受歡迎的UI框架&#xff0c;為開發者提供了強大的基礎組件。然而&#xff0c;面對不同行業的特定需求&#xff0c;僅僅依靠現有的組件往往難以…

Object Sense (OSE):一款從編輯器腳本發展起來的編程語言

引言&#xff1a;從Vim編輯器走出的語言在編程語言的世界里&#xff0c;許多革命性的創新往往源于看似簡單的工具。Object Sense&#xff08;簡稱OSE&#xff09;的誕生&#xff0c;便與一款經典文本編輯器——Vim息息相關。它的前身是Vim的腳本語言VimL&#xff08;Vimscript&…

我考PostgreSQL中級專家證書二三事

1. 為什么選擇PGCE&#xff1f;PostgreSQL的開源特性、高性能和高擴展性早已讓我心生向往&#xff0c;而PGCE認證不僅是對技術能力的認可&#xff0c;更是一張通往更高職業舞臺的“通行證”。官方資料提到&#xff0c;PGCE考試涵蓋性能優化、高可用架構、復雜查詢處理、內核原理…

Java 動態導出 Word 登記表:多人員、分頁、動態表格的最佳實踐

本文詳細講解如何使用 Java 動態導出包含多人員報名表的 Word 文檔&#xff0c;每人占據獨立一頁&#xff0c;并支持動態表格行&#xff08;如個人經歷&#xff09;。我們對比了多種實現方案&#xff0c;最終推薦基于 Freemarker XML 模板 或 docx4j 的靈活方式&#xff0c;并…

【element-ui el-table】多選表格勾選時默認勾選了全部,row-key綁定異常問題解決

項目場景&#xff1a; Element-UI的el-table組件row-key使用問題 同一個頁面使用了幾個table&#xff0c;這幾個table都使用了多選&#xff0c;row-key屬性&#xff0c;其中row-key的綁定方式都是用的靜態綁定&#xff0c;row-key“username”或row-key“id”&#xff0c;可正常…

C#注釋技巧與基礎編程示例

以下是一個包含基礎注釋的 C# 程序示例&#xff0c;展示了 C# 中各類注釋的使用方法&#xff1a;using System;namespace BasicCSharpProgram {/// <summary>/// Program 類是應用程序的入口點/// 包含 Main 方法作為程序執行的起點/// </summary>public class Pro…

極客大挑戰2019-HTTP

涵蓋知識&#xff1a;UA頭偽造漏洞&#xff1a;全稱&#xff1a;User-Agent 這個部分包含我們所使用的操作系統版本&#xff0c;cpu&#xff0c;瀏覽器類型等。來源偽造漏洞&#xff1a;在http請求頭中會攜帶一個Referer&#xff0c;這個用來表示服務器用戶是從哪個地方來的X-F…

談談ArrayList與Vector的理解?

目錄 擴容機制 ArrayList擴容源碼 Vector擴容源碼 二者區別 擴展&#xff1a;stack(棧&#xff09; 1.創建stack對象 2. 入棧(先進后出&#xff09; 3.出棧 擴展&#xff1a;舉個例子&#xff1a;實現下字符串逆置&#xff0c;利用stack棧來實現。 從接口實現上&#xff…

【Linux庖丁解牛】— 多線程同步 !

1. 什么是線程同步為什么會有線程同步&#xff0c;那一定是有了新問題。互斥可以解決臨界資源被同時訪問的問題&#xff0c;但是純互斥也會帶來新的問題。由于當前被執行的線程離cpu最近【其他線程被阻塞掛起還要被喚醒】&#xff0c;所以&#xff0c;當前進程對于競爭鎖天然就…

基于arduino uno r3主控的環境監測系統設計-1

準備設計arduino uno r3為主控的環境監測系統&#xff0c;通過傳感器采集TVOC&#xff08;總揮發性有機物&#xff09;、HCHO&#xff08;甲醛&#xff09;和eCO2&#xff08;等效二氧化碳&#xff09;數據&#xff0c;并顯示在LCD屏幕上&#xff0c;同時支持數據記錄到SD卡&am…

ITIL 4:云計算與微服務對組織架構的影響

這幾年&#xff0c;很多組織在推進數字化轉型時遇到一個共同的問題&#xff1a;業務節奏越來越快&#xff0c;但內部協作的“架構”卻越來越跟不上節奏。技術架構的變革&#xff0c;必須同步推動組織架構的重塑。特別是隨著云計算和微服務架構的廣泛應用&#xff0c;這種影響愈…

【Android】xml和Java兩種方式實現發送郵件頁面

三三要成為安卓糕手 一&#xff1a;xml中LinearLayout布局參數的使用 1&#xff1a;xml代碼 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http:/…

美林數據用大模型重構電能質量評估,讓隱蔽合規問題無所遁形

在“雙碳”目標驅動下&#xff0c;電網企業正加速推進數字化轉型&#xff0c;電能質量評估作為電力系統安全運行的核心環節&#xff0c;其合規性與效率直接影響著電網智能化水平。然而&#xff0c;傳統人工審核模式已難以應對海量報告與復雜標準——單份報告需20-30人天核對、關…

前端基礎 JS Vue3 Ajax

一、JSalert( .... ) //彈出框console.log( ....... ) //輸出到控制臺瀏覽器JS引入方式&#xff1a;1、內部腳本&#xff1a;將JS代碼定義在HTML頁面中位于<script></script>標簽之間2、外部腳本&#xff1a;將JS代碼寫在外部JS文件中&#xff0c;在HTML頁面中使用…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘notebook’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘notebook’問題 一、摘要 在使用 PyCharm 進行 Python 開發時&#xff0c;常常需要通過 pip install 安裝第三方包。但有時即便已經安裝成功&#xff0c;運行代…

一、Vue概述以及快速入門

什么是VueVue的快速入門代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue快速入門</title><script src"js/vue.js"></script> </head> <bod…

模型的存儲、加載和部署

定義損失函數并以此訓練和評估模型 存儲模型可以只存儲state_dict或模型參數&#xff0c;每當需要部署經過訓練的模型時&#xff0c;創建模型的對象并從文件中加載參數&#xff0c;這是 Pytorch 創建者推薦的方法。 目錄 模型的存儲、加載 模型的部署 模型的存儲、加載 承接…

Java學習第七十部分——微服務架構

目錄 一、前言提要 二、核心優勢 三、核心技術棧 四、構建步驟 五、困難挑戰 六、總結歸納 一、前言提要 Java 微服務架構是一種使用 Java 技術棧構建分布式系統的方法論&#xff0c;它將單一的大型應用程序分解為一組小型、獨立、松耦合、可獨立部署和擴展的服務。每個服…

六邊形滾動機器人cad【7張】三維圖+設計書明說

摘 要 機械制造業是國家的重要產業,隨著時代的發展,智能化越來越在生活中變得普遍,工業的發展深深的影響著一個國家的經濟發展。全球經濟的發展帶領著機械工業在不斷的進步。隨著國外先進技術在我國的傳播,也影響著我國技術的發展,在全球經濟的大環境的推動下,大型四邊形…

人形機器人加快先進AI機器人開發

物理AI的新時代通用人形機器人專為快速適應現有的以人類為中心的城市和工業工作空間而構建&#xff0c;用以承擔枯燥、重復性或對體力要求高的工作任務。這些機器人正在從工廠車間走向醫療健康機構&#xff0c;通過自動化幫助人類工作&#xff0c;緩解勞動力短缺問題。但是&…