最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、核心區(qū)別對比

方法輸入類型輸出類型適用場景轉(zhuǎn)換關(guān)系
map()Function<T,R>Stream<R>元素的一對一轉(zhuǎn)換1:1
flatMap()Function<T,Stream<R>>Stream<R>元素的一對多轉(zhuǎn)換并合并1:N

二、map()方法詳解

1. 基本功能

將流中的每個元素轉(zhuǎn)換為另一個對象

2. 典型應(yīng)用場景

  • 類型轉(zhuǎn)換
  • 提取對象屬性
  • 數(shù)值計算

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)大寫
        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:提取對象屬性
        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. 基本功能

將每個元素轉(zhuǎn)換為流,然后將所有流合并為一個流

2. 典型應(yīng)用場景

  • 處理嵌套集合
  • 拆分字符串為多個元素
  • 合并多個流

3. 示例代碼

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        // 示例1:展開嵌套集合
        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]
    }
}

四、對比使用案例

場景:學(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"))
        );

        // 錯誤用法:map處理嵌套集合
        List<List<String>> wrongResult = students.stream()
                .map(Student::getCourses)
                .collect(Collectors.toList());
        System.out.println("錯誤結(jié)果:" + wrongResult); 
        // [[Math, Physics], [History, Art]]

        // 正確用法:flatMap展開嵌套集合
        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)計所有課程數(shù)量
        long courseCount = students.stream()
                .flatMap(student -> student.getCourses().stream())
                .count();
        System.out.println("總課程數(shù):" + courseCount); // 4
    }
}

五、常見問題解答

Q1:什么時候該用flatMap?

當(dāng)需要處理以下結(jié)構(gòu)時:

  • List<List<T>> → List<T>
  • Stream<Stream<R>> → Stream<R>
  • 需要拆分元素為多個子元素時

Q2:可以組合使用map和flatMap嗎?

可以,常見組合方式:

list.stream()
    .map(...)    // 初步轉(zhuǎn)換
    .flatMap(...) // 展開處理
    .collect(...)

Q3:如何處理多層嵌套?

使用多次flatMap:

List<List<List<String>>> deepNested = ...;
deepNested.stream()
    .flatMap(List::stream)  // 展開第一層
    .flatMap(List::stream)  // 展開第二層
    .collect(...);

六、總結(jié)對比

操作輸入元素輸出元素數(shù)量最終結(jié)果結(jié)構(gòu)
map單個元素1個新元素保持原流結(jié)構(gòu)
flatMap單個元素0-N個新元素合并為單一流結(jié)構(gòu)

選擇原則

  • 需要簡單轉(zhuǎn)換單個元素 → 使用map()
  • 需要展開嵌套結(jié)構(gòu)/生成多個元素 → 使用flatMap()

以上代碼均可直接復(fù)制到Java 8+環(huán)境中運(yùn)行,建議在IDE中實(shí)際測試觀察輸出結(jié)果,以加深理解。

到此這篇關(guān)于Java Stream中map與flatMap對比的文章就介紹到這了,更多相關(guān)Java map與flatMap對比內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解

    java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解

    這篇文章主要為大家介紹了java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 關(guān)于Java8新特性O(shè)ptional類的詳細(xì)解讀

    關(guān)于Java8新特性O(shè)ptional類的詳細(xì)解讀

    Optional類是一個容器類,它可以保存類型T的值,代表這個值存在?;蛘邇H僅保存null,表示這個值不存在,原來用 null 表示一個值不存在,現(xiàn)在Optional 可以更好的表達(dá)這個概念。并且可以避免空指針異常,需要的朋友可以參考下
    2023-05-05
  • springboot項(xiàng)目如何部署到服務(wù)器

    springboot項(xiàng)目如何部署到服務(wù)器

    這篇文章主要介紹了springboot項(xiàng)目如何部署到服務(wù)器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java服務(wù)假死之生產(chǎn)事故的排查與優(yōu)化問題

    Java服務(wù)假死之生產(chǎn)事故的排查與優(yōu)化問題

    在服務(wù)器上通過curl命令調(diào)用一個Java服務(wù)的查詢接口,半天沒有任何響應(yīng),怎么進(jìn)行這一現(xiàn)象排查呢,下面小編給大家記一次生產(chǎn)事故的排查與優(yōu)化——Java服務(wù)假死問題,感興趣的朋友一起看看吧
    2022-07-07
  • springmvc處理模型數(shù)據(jù)Map過程解析

    springmvc處理模型數(shù)據(jù)Map過程解析

    這篇文章主要介紹了springmvc處理模型數(shù)據(jù)Map過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • java向es中寫入數(shù)據(jù)報錯org.elasticsearch.action.ActionReque問題

    java向es中寫入數(shù)據(jù)報錯org.elasticsearch.action.ActionReque問題

    這篇文章主要介紹了java向es中寫入數(shù)據(jù)報錯org.elasticsearch.action.ActionReque問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring Boot中的路徑變量示例詳解

    Spring Boot中的路徑變量示例詳解

    SpringBoot中PathVariable通過@PathVariable注解實(shí)現(xiàn)URL參數(shù)與方法參數(shù)綁定,支持多參數(shù)接收、類型轉(zhuǎn)換、可選參數(shù)、默認(rèn)值及正則約束,是構(gòu)建RESTful API的核心工具,本文給大家介紹Spring Boot中的路徑變量示例,感興趣的朋友一起看看吧
    2025-07-07
  • Java中實(shí)現(xiàn)多線程的幾種方式總結(jié)

    Java中實(shí)現(xiàn)多線程的幾種方式總結(jié)

    文章介紹了三種創(chuàng)建線程的方式:繼承Thread類、實(shí)現(xiàn)Runnable接口和實(shí)現(xiàn)Callable接口,并比較了它們之間的區(qū)別和優(yōu)缺點(diǎn)
    2025-01-01
  • 有關(guān)ThreadLocal的面試題你真的懂了嗎

    有關(guān)ThreadLocal的面試題你真的懂了嗎

    這篇文章主要介紹了面試題ThreadLocal,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-06-06
  • 深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解

    深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解

    本篇文章是對Synchronized和java.util.concurrent.locks.Lock的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06

最新評論

古丈县| 电白县| 格尔木市| 赣州市| 尼玛县| 桃园县| 武汉市| 陵川县| 来凤县| 外汇| 湟中县| 南平市| 通河县| 余干县| 依安县| 蓝田县| 平原县| 都江堰市| 武邑县| 佛坪县| 聂拉木县| 湖口县| 西藏| 伽师县| 昌宁县| 抚松县| 宣威市| 平阳县| 西峡县| 泉州市| 漾濞| 定兴县| 黎川县| 云安县| 塘沽区| 长海县| 大连市| 盐城市| 石台县| 岳普湖县| 沁源县|