Java?Stream中map與flatMap對(duì)比超詳細(xì)教程
一、核心區(qū)別對(duì)比
方法 | 輸入類型 | 輸出類型 | 適用場(chǎng)景 | 轉(zhuǎn)換關(guān)系 |
---|---|---|---|---|
map() | Function<T,R> | Stream<R> | 元素的一對(duì)一轉(zhuǎn)換 | 1:1 |
flatMap() | Function<T,Stream<R>> | Stream<R> | 元素的一對(duì)多轉(zhuǎn)換并合并 | 1:N |
二、map()方法詳解
1. 基本功能
將流中的每個(gè)元素轉(zhuǎn)換為另一個(gè)對(duì)象
2. 典型應(yīng)用場(chǎng)景
- 類型轉(zhuǎn)換
- 提取對(duì)象屬性
- 數(shù)值計(jì)算
3. 示例代碼
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class MapExample { public static void main(String[] args) { // 示例1:字符串轉(zhuǎn)大寫(xiě) List<String> words = Arrays.asList("hello", "world"); List<String> upperCaseWords = words.stream() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(upperCaseWords); // [HELLO, WORLD] // 示例2:提取對(duì)象屬性 class User { String name; User(String name) { this.name = name; } String getName() { return name; } } List<User> users = Arrays.asList( new User("Alice"), new User("Bob") ); List<String> names = users.stream() .map(User::getName) .collect(Collectors.toList()); System.out.println(names); // [Alice, Bob] } }
三、flatMap()方法詳解
1. 基本功能
將每個(gè)元素轉(zhuǎn)換為流,然后將所有流合并為一個(gè)流
2. 典型應(yīng)用場(chǎng)景
- 處理嵌套集合
- 拆分字符串為多個(gè)元素
- 合并多個(gè)流
3. 示例代碼
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class FlatMapExample { public static void main(String[] args) { // 示例1:展開(kāi)嵌套集合 List<List<String>> nestedList = Arrays.asList( Arrays.asList("Java", "Python"), Arrays.asList("C++", "Go"), Arrays.asList("JavaScript", "TypeScript") ); List<String> languages = nestedList.stream() .flatMap(List::stream) .collect(Collectors.toList()); System.out.println(languages); // [Java, Python, C++, Go, JavaScript, TypeScript] // 示例2:拆分字符串為單詞 List<String> sentences = Arrays.asList( "Hello World", "Java Stream API" ); List<String> words = sentences.stream() .flatMap(sentence -> Arrays.stream(sentence.split(" "))) .collect(Collectors.toList()); System.out.println(words); // [Hello, World, Java, Stream, API] } }
四、對(duì)比使用案例
場(chǎng)景:學(xué)生選課數(shù)據(jù)處理
import java.util.*; import java.util.stream.*; class Student { String name; List<String> courses; Student(String name, List<String> courses) { this.name = name; this.courses = courses; } List<String> getCourses() { return courses; } } public class CompareExample { public static void main(String[] args) { List<Student> students = Arrays.asList( new Student("Alice", Arrays.asList("Math", "Physics")), new Student("Bob", Arrays.asList("History", "Art")) ); // 錯(cuò)誤用法:map處理嵌套集合 List<List<String>> wrongResult = students.stream() .map(Student::getCourses) .collect(Collectors.toList()); System.out.println("錯(cuò)誤結(jié)果:" + wrongResult); // [[Math, Physics], [History, Art]] // 正確用法:flatMap展開(kāi)嵌套集合 List<String> correctResult = students.stream() .flatMap(student -> student.getCourses().stream()) .collect(Collectors.toList()); System.out.println("正確結(jié)果:" + correctResult); // [Math, Physics, History, Art] // 綜合應(yīng)用:統(tǒng)計(jì)所有課程數(shù)量 long courseCount = students.stream() .flatMap(student -> student.getCourses().stream()) .count(); System.out.println("總課程數(shù):" + courseCount); // 4 } }
五、常見(jiàn)問(wèn)題解答
Q1:什么時(shí)候該用flatMap?
當(dāng)需要處理以下結(jié)構(gòu)時(shí):
List<List<T>>
→List<T>
Stream<Stream<R>>
→Stream<R>
- 需要拆分元素為多個(gè)子元素時(shí)
Q2:可以組合使用map和flatMap嗎?
可以,常見(jiàn)組合方式:
list.stream() .map(...) // 初步轉(zhuǎn)換 .flatMap(...) // 展開(kāi)處理 .collect(...)
Q3:如何處理多層嵌套?
使用多次flatMap:
List<List<List<String>>> deepNested = ...; deepNested.stream() .flatMap(List::stream) // 展開(kāi)第一層 .flatMap(List::stream) // 展開(kāi)第二層 .collect(...);
六、總結(jié)對(duì)比
操作 | 輸入元素 | 輸出元素?cái)?shù)量 | 最終結(jié)果結(jié)構(gòu) |
---|---|---|---|
map | 單個(gè)元素 | 1個(gè)新元素 | 保持原流結(jié)構(gòu) |
flatMap | 單個(gè)元素 | 0-N個(gè)新元素 | 合并為單一流結(jié)構(gòu) |
選擇原則:
- 需要簡(jiǎn)單轉(zhuǎn)換單個(gè)元素 → 使用
map()
- 需要展開(kāi)嵌套結(jié)構(gòu)/生成多個(gè)元素 → 使用
flatMap()
以上代碼均可直接復(fù)制到Java 8+環(huán)境中運(yùn)行,建議在IDE中實(shí)際測(cè)試觀察輸出結(jié)果,以加深理解。
到此這篇關(guān)于Java Stream中map與flatMap對(duì)比的文章就介紹到這了,更多相關(guān)Java map與flatMap對(duì)比內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot教程之產(chǎn)生的背景及其優(yōu)勢(shì)
這篇文章主要介紹了spring boot教程之產(chǎn)生的背景及其優(yōu)勢(shì)的相關(guān)資料,需要的朋友可以參考下2022-08-08Java實(shí)現(xiàn)讀取TXT和CSV文件內(nèi)容
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)讀取TXT和CSV文件內(nèi)容的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02Java開(kāi)發(fā)SpringBoot集成接口文檔實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Java開(kāi)發(fā)SpringBoot如何集成接口文檔的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10springboot @RequestBody 接收字符串實(shí)例
這篇文章主要介紹了springboot @RequestBody 接收字符串實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java數(shù)據(jù)結(jié)構(gòu)之樹(shù)和二叉樹(shù)的相關(guān)資料
這篇文章主要介紹了Java?數(shù)據(jù)結(jié)構(gòu)之樹(shù)和二叉樹(shù)相關(guān)資料,文中通過(guò)示例代碼和一些相關(guān)題目來(lái)做介紹,非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下!2023-01-01