欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?Stream中map與flatMap對(duì)比超詳細(xì)教程

 更新時(shí)間:2025年05月13日 10:02:45   作者:不如打代碼KK  
這篇文章主要介紹了Java?Stream中map與flatMap對(duì)比的相關(guān)資料,map()用于一對(duì)一轉(zhuǎn)換,而flatMap()用于一對(duì)多轉(zhuǎn)換并合并結(jié)果,文章詳細(xì)解釋了每個(gè)方法的基本功能、典型應(yīng)用場(chǎng)景和示例代碼,需要的朋友可以參考下

一、核心區(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ì)

    這篇文章主要介紹了spring boot教程之產(chǎn)生的背景及其優(yōu)勢(shì)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • java中避免集合死鏈調(diào)用詳情

    java中避免集合死鏈調(diào)用詳情

    這篇文章主要介紹了java中避免集合死鏈調(diào)用,開(kāi)發(fā)過(guò)程中, 一些集合 的變動(dòng)會(huì)觸發(fā)任務(wù)去 改變 其他的集合 ,為了保障任務(wù)的正確執(zhí)行,應(yīng)避免出現(xiàn)死循環(huán)調(diào)用,即對(duì) 集合之間的影響關(guān)系 進(jìn)行一些限制,下面文章就來(lái)看看這種問(wèn)題的避免
    2021-09-09
  • IDEA必備開(kāi)發(fā)神器之EasyCode

    IDEA必備開(kāi)發(fā)神器之EasyCode

    對(duì)于java程序員來(lái)說(shuō),日常工作中就是crud的操作,每次都要搭建MVC三層,還是很繁瑣,這里就出現(xiàn)了神器easycode的工具.可以快速生成代碼.并且還可以自定義模板.需要的朋友可以參考下
    2021-05-05
  • Java實(shí)現(xiàn)讀取TXT和CSV文件內(nèi)容

    Java實(shí)現(xiàn)讀取TXT和CSV文件內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)讀取TXT和CSV文件內(nèi)容的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-02-02
  • Java開(kāi)發(fā)SpringBoot集成接口文檔實(shí)現(xiàn)示例

    Java開(kāi)發(fā)SpringBoot集成接口文檔實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Java開(kāi)發(fā)SpringBoot如何集成接口文檔的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • java時(shí)間日期使用與查詢代碼詳解

    java時(shí)間日期使用與查詢代碼詳解

    這篇文章主要介紹了java時(shí)間日期使用與查詢代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • springboot @RequestBody 接收字符串實(shí)例

    springboot @RequestBody 接收字符串實(shí)例

    這篇文章主要介紹了springboot @RequestBody 接收字符串實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java爬蟲(chóng)模擬登陸的實(shí)例詳解

    java爬蟲(chóng)模擬登陸的實(shí)例詳解

    在本篇文章里小編給大家分享的是一篇關(guān)于java爬蟲(chóng)模擬登陸的實(shí)例詳解內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。
    2021-01-01
  • 在Java8中構(gòu)建Stream流的多種方式詳解

    在Java8中構(gòu)建Stream流的多種方式詳解

    當(dāng)我們處理集合數(shù)據(jù)時(shí),往往需要對(duì)其進(jìn)行各種操作,如過(guò)濾、映射、排序、歸約等,在 Java 8 中引入的 Stream 流為我們提供了一種更加簡(jiǎn)潔和靈活的方式來(lái)處理數(shù)據(jù),本文將介紹如何基于 Stream 構(gòu)建流,為你展示創(chuàng)建和操作流的多種方法
    2023-08-08
  • Java數(shù)據(jù)結(jié)構(gòu)之樹(shù)和二叉樹(shù)的相關(guān)資料

    Java數(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

最新評(píng)論