Stream流中的Map與flatMap的區(qū)別及說明
Map與flatMap的基本概念
Map用于將流中的每個元素通過指定函數(shù)轉換為另一個元素,生成一個一對一映射的新流。
例如將字符串流轉換為對應長度流:
List<String> words = Arrays.asList("a", "bb", "ccc");
List<Integer> lengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
// 輸出: [1, 2, 3]
flatMap用于將每個元素轉換為流后合并所有流,形成一對多映射的扁平化結果。
例如拆分字符串中的單詞:
List<String> lines = Arrays.asList("hello world", "java stream");
List<String> words = lines.stream()
.flatMap(line -> Arrays.stream(line.split(" ")))
.collect(Collectors.toList());
// 輸出: ["hello", "world", "java", "stream"]
核心區(qū)別對比
- 輸入輸出關系
Map保持原始流元素數(shù)量不變,flatMap可能改變元素數(shù)量(如拆分為多個子流后合并)
- 返回值要求
Map的Function返回普通對象,flatMap的Function必須返回Stream對象
- 數(shù)據(jù)結構處理
Map適合單一元素轉換,flatMap適合處理嵌套集合(如List<List>)
典型應用場景
Map適用場景
數(shù)據(jù)類型轉換(String→Integer)、屬性提取(對象→ID)、簡單計算(數(shù)值→平方值)
flatMap適用場景
- 合并多個集合:
List<List<Integer>> → List<Integer> - 分解復合結構:字符串句子→單詞流、樹節(jié)點→子樹節(jié)點流
- 過濾后展開操作:先filter再flatMap處理有效數(shù)據(jù)
性能注意事項
flatMap涉及流合并操作,可能產生更多臨時對象。
對于簡單轉換優(yōu)先使用map,多層嵌套數(shù)據(jù)結構才使用flatMap。
代碼示例對比
處理書籍作者場景:
// 使用map(保留嵌套結構)
List<Book> books = ...;
List<List<String>> authors = books.stream()
.map(Book::getAuthors)
.collect(Collectors.toList());
// 使用flatMap(扁平化結構)
List<String> allAuthors = books.stream()
.flatMap(book -> book.getAuthors().stream())
.collect(Collectors.toList());
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java同步關鍵字synchronize底層實現(xiàn)原理解析
synchronized關鍵字對大家來說并不陌生,當我們遇到并發(fā)情況時,優(yōu)先會想到用synchronized關鍵字去解決,synchronized確實能夠幫助我們去解決并發(fā)的問題,接下來通過本文給大家分享java synchronize底層實現(xiàn)原理,感興趣的朋友一起看看吧2021-08-08
SpringBoot如何使用validator框架優(yōu)雅地校驗參數(shù)
文章介紹了如何使用SpringValidation進行參數(shù)校驗,包括引入依賴、@requestBody和@requestParam參數(shù)校驗、統(tǒng)一異常處理、分組校驗、嵌套校驗、自定義校驗、業(yè)務規(guī)則校驗以及@Valid和@Validated的區(qū)別,同時,列舉了常用的BeanValidation和HibernateValidator注解2025-02-02
詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析
這篇文章主要介紹了詳解log4j-over-slf4j與slf4j-log4j12共存stack overflow異常分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
基于HTTP協(xié)議實現(xiàn)簡單RPC框架的方法詳解
RPC全名(Remote?Procedure?Call),翻譯過來就是遠程過程調用,本文將為大家介紹如何基于HTTP協(xié)議實現(xiàn)簡單RPC框架,感興趣的小伙伴可以了解一下2023-06-06

