Stream 的 flatMap 和 map 方法

用flatMap解析复杂对象的数据 本文对比了Java Stream中map和flatMap的区别及使用场景。map用于元素一对一转换,而flatMap能够将嵌套流合并为单一流。示例中演示了如何将复杂数据结构List<Map<String, List<Student>>>转换为平铺的List<Student>:使用map会保留嵌套结构(输出List<List<Student>>),而flatMap能直接输出平铺结构。文章还展示了map与flatMap结合使用的场景,先通过 阅读详情
AI摘要

本文主要介绍Java中map和flatMap方法。阐述了二者源码定义,对比了主要区别,包括传入函数返回类型、处理嵌套结构方式不同。还给出代码示例,展示如何用它们处理List<List<Integer>>。总结指出map适用于元素转换,flatMap适用于展平嵌套结构。

一、源码定义

Stream.map:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

 Stream.flatMap:

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

二、主要区别

1. 传入的函数返回类型不同
        map:传入的函数返回一个单个对象。map 会将流中的每个元素转换为另一个对象,但不会改变流的结构。
        flatMap:传入的函数返回一个流(Stream)。flatMap 会将流中的每个元素转换为一个流,然后将这些流合并成一个单一的流。
2. 处理嵌套结构的方式不同
        map:不会展平嵌套的结构。使用 map 会生成一个嵌套的流(例如 Stream<List<T>>)。
        flatMap:会展平嵌套的结构。使用 flatMap 会将嵌套的流合并成一个单一的流(例如 Stream<T>)。


三、代码示例

使用 map
假设我们有一个 List<List<Integer>>,我们使用 map 将每个内部列表转换为一个新列表:

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

public class Example {
    public static void main(String[] args) {
        List<List<Integer>> nestedList = Arrays.asList(
            Arrays.asList(1, 2),
            Arrays.asList(3, 4)
        );

        List<List<Integer>> mappedList = nestedList.stream()
            .map(innerList -> innerList.stream().map(x -> x * 2).collect(Collectors.toList()))
            .collect(Collectors.toList());

        System.out.println(mappedList); // 输出: [[2, 4], [6, 8]]
    }
}

使用 flatMap
同样的 List<List<Integer>>,我们使用 flatMap 将其展平为一个单一的 List<Integer>:

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

public class Example {
    public static void main(String[] args) {
        List<List<Integer>> nestedList = Arrays.asList(
            Arrays.asList(1, 2),
            Arrays.asList(3, 4)
        );

        List<Integer> flattenedList = nestedList.stream()
            .flatMap(List::stream) // 将每个内部列表转换为一个流,并合并这些流
            .map(x -> x * 2) // 对每个元素进行操作
            .collect(Collectors.toList());

        System.out.println(flattenedList); // 输出: [2, 4, 6, 8]
    }
}

四、总结

map:适用于将流中的每个元素转换为另一个对象,但不会改变流的结构。
flatMap:适用于将流中的每个元素转换为一个流,并将这些流合并成一个单一的流,从而展平嵌套的结构。

Java8Stream的flatmap应用(区别map)-优化嵌套for循环条件筛选 前面讲Stream的常用api中讲到map的使用。 阅读详情

相关推荐

Java8的stream流中flatMap()方法的作用

在flatMap()方法中,我们传递了List::stream函数引用,它将每个列表映射为一个流。例如,假设我们有一个包含多个字符串的流,每个字符串表示一个单词列表,我们想要将这些单词合并为一个单词流。在Java 8的Stream流中,flatMap()方法用于将流中的每个元素转换为一个新的流,然后将这些新的流合并成一个流。flatMap()方法接受一个函数作为参数,该函数将每个流的元素映射为一个新的流。然后,flatMap()方法将这些新的流合并成一个流,作为其结果返回。

舒一笑的博客 2044

Stream之flatMap

flatMap:将小Stream转换为大Stream 目标:将如下对象中的分类category提取出来,去重。其中如"哲学,爱情",需要解析为两个分类,["哲学","爱情"] [{"age":33,"books":[{"category":"哲学,爱情","id":1,"intro":"用一把刀划分了爱恨","name":"刀的两侧是光明与黑暗","score":88},{"category":"个人成长,爱情","id":2,"intro":"讲述如何从失败中明悟真理","name":"一个人.

一起coding,一起嗨。 2万+

手把手教你设计MTBF加速寿命试验:从阿伦尼斯模型到卡方计算(含Excel模板)

本文详细介绍了如何设计MTBF加速寿命试验,从阿伦尼斯模型到卡方计算,帮助工程师在合理时间内获得准确的MTBF数据。通过工业电源模块的实例演示,涵盖活化能确定、温度应力设计、样本量计算及数据记录规范,并提供Excel模板实现自动化计算,显著提升测试效率。

weixin_42563415的博客 541

关于stream的flatMap方法简单使用

简述 在JDK8开始,列表操作新增了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑; 其中,flatMap()方法也是其中的API,flatMap()简单来说就是将多个stream流合并成一个stream,当然你也可以在合并的时候结合其他的API做一些过滤或者转换之类的,如filter,下面详细阐述一下。 案例 1、先来一个简单的使用案例: public static void main(String[] a

qq_31499975的博客 2万+

libfranka---joint_impendence_control例程分析

joint_impedance_control.cpp例程分析 部分内容来自链接,我个人以初学者的角度对代码进行了更加细致的解释。 核心部分: // Set and initialize trajectory parameters. const double radius = 0.05; const double vel_max = 0.25; const double acceleration_time = 2.0; const double run_time = 20.0; d

weixin_41567783的博客 1121

单目和多目视觉统一标定

单目和多目视觉统一标定 一.单目视觉标定 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在

吴建明wujianming_110117 2911

Java8的 lambda Stream的 map 和 flatmap 方法区别 map和flatMap方法的用法

今天在看java lambda stream的时候,发现2个方法map 和 flatMap 方法很相似,都是遍历集合,返回对象,本着刨根问底的决心,来对比下 这2个方法的相同点和区别。

HaHa_Sir的博客 5679

迈创Cameralink采集卡与MIL软件集成开发实战指南

本文详细介绍了迈创Cameralink采集卡与MIL软件的集成开发实战指南,涵盖硬件安装、驱动配置、MIL软件深度设置及图像采集处理等关键步骤。特别适合工业视觉检测和医疗影像领域,通过优化配置和性能调优,实现高速稳定的图像处理。

weixin_29204205的博客 423

中将2个map的值合并_Java Stream中map和flatMap方法

最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别。虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里。通过演示Demo中的代码可以了解map()和flatMap()的具体功能差异。首先来一段简单的stream语法foreach方法的用法演示Demo:Listfuns=Arrays.asLis...

weixin_34890108的博客 1567

【四季发财中线】通达信炒股指标副图指标使用图文教程,短线紫色柱线操作,与中线短柱线共振抓牛股妖股主升浪

如上图标记位置,对应的是副图指标的紫色柱线开始的位置,这个紫色柱线信号开始出现,也是短线进场做多的信号,紫色柱线的持续出现和加长,可以持股待涨,或行情继续上涨的可以在分时行情中逢低进场短线顺势做多。如上图标记部分,指标的主要部分信号,三行柱线-ZR-ZC -ZM,当出现这三行信号时,中线或波段看多做多,信号持续则中线顺势做多和持股待涨。不论是跟踪信号的出现先后进场和持股,或是在中线多头的行情中,找到短线转多信号进场做安全的短线操作机会,都是非常好的指标信号和辅助操作功能。

weixin_69760830的博客 1602

网络工程师的Python入门实战:手把手教你写交换机配置备份脚本

本文详细介绍了如何利用Python为网络工程师开发一个高效的交换机配置备份脚本,涵盖环境搭建、设备连接方案、智能设备发现、多因素认证、异常处理、配置差异对比等关键步骤。通过实战案例展示如何将备份时间从4小时缩短至15分钟,显著提升运维效率,特别适用于华为交换机等设备的配置导出与备份需求。

weixin_30291791的博客 304

stream map方法_Java Stream中map和flatMap方法

最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别。虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里。通过演示Demo中的代码可以了解map()和flatMap()的具体功能差异。首先来一段简单的stream语法foreach方法的用法演示Demo:Listfuns=Arrays.asLis...

weixin_39925350的博客 610

Hermes 教程 05:多 Agent 编排

本文介绍了Hermes v0.13.0中的四种多Agent协作模式:1)delegate_task快速子任务模式,适合2-3个独立并行任务;2)spawn子Agent模式,实现零成本并行多步流水线;3)tmux交互子Agent模式,支持长期自主任务;4)全新Kanban看板系统,提供持久化AI团队协作框架。各模式在隔离级别、时长、工具访问和适用场景上存在差异,其中spawn模式通过独立上下文窗口实现零上下文成本。文章详细说明了每种模式的使用方法、限制条件和典型应用场景,并提供了具体代码示例和可视化流程图。K

程序猿_三产 537

java flatmapfunction_Java Stream中map和flatMap方法

最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别。虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里。通过演示Demo中的代码可以了解map()和flatMap()的具体功能差异。首先来一段简单的stream语法foreach方法的用法演示Demo:List funs = Arrays.asList("F", "U", "...

weixin_36073392的博客 315

《基于YOLOv5/8/10的足球比赛球员识别系统毕设全指南:从开发到部署的一站式实战》

本文提出了一个基于YOLO系列模型的足球球员识别系统,具备完整的开发流程和技术方案。系统通过YOLOv5/8/10三大框架实现球员检测,平衡精度与速度需求。开发过程包含数据标注与增强、模型训练调优、PyQt5界面开发等关键环节,并提供了模型轻量化、多任务扩展等优化方向。系统可实现单张图像和视频流的实时识别,支持跨设备部署,适用于赛事分析和训练复盘场景。项目特色在于完整的技术实现路径和对不同YOLO框架的性能对比,为计算机视觉在体育领域的应用提供实践参考。

m0_71589036的博客 216

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Stream API:filter、map和flatMap方法

写给大忙人看的JavaSE8中的Stream API:filter、map和flatMap方法

小烁笔记 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

stream的filter、map和flatMap方法

Java核心技术 卷二 filter、map和flatMap方法 流的转换会产生一个新的流,它的元素派生自另一个流中的元素。 List&lt;String&gt;wordList = ....; Stream&lt;String&gt; longWords = wordList.stream().filter(w-&gt;w.length() &gt; 12); 将所有的单词转化成小写 Stre...

e31006的博客 4171

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java8 Stream接口流式方法:map操作、filter操作以及flatMap操作

点击关注公众号,利用碎片时间学习关于stream 流式操作,在rt.jar 包里面,ReferencePipeline管道方式操作数据 下面集成所有操作方法,利用这些流,处理大数据的方式,...

Java笔记虾 2823

JAVA8 Stream接口流式方法 map操作 filter操作以及flatMap操作

关于stream流式操作,在rt.jar包里面,ReferencePipeline管道方式操作数据 下面集成所有操作方法,利用这些流,处理大数据的方式,效率提升明显,并且很多语言都支持这种操作,相当于统一了这种编程方式。我们先来看看这三个操作过滤的是什么数据,1,filter操作,我们先看方法的定义源码如下;一个单纯的过滤操作直接返回传入类型(dd);stream.//返回字符串为a的值2.map操作,先看方法定义。...

m0_67392409的博客 1745

java8之Stream API(filter,map和flatMap方法)

为什么80%的码农都做不了架构师?>>> ...

weixin_34408717的博客 378

Java8新特性 - Stream - 24 - Stream的map与flatMap方法的区别

0.前言 各位看官,本片文章中的文字描述部分是核心,务必通读后再去看代码,否则可能有些吃力 1.方法描述 1.1 map <R> Stream<R> map(Function<? super T, ? extends R> mapper); 【功能说明】:返回一个包含【给定功能处理结果】的Stream对象。 【举例说明1】 :输入一个字符串“a”,功能方法中将字符串添加了前缀 “perfix_”,则返回的Stream对象中的元素为 :【字符串 :“perfix_a”】

northcastle的博客 1000

Optional和Stream的map与flatMap

Optional的map和flatMap Optional存在map和flatMap方法。map源码如下 public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!...

yingfeng612的专栏 1597

java8stream组装map_Java8Stream的flatmap方法使用

stream中的flatmap是stream的一种中间操作,它和stream的map一样,是一种收集类型的stream中间操作,但是与map不同的是,它可以对stream流中单个元素再进行拆分(切片),从另一种角度上说,使用了它,就是使用了双重for循环。查看Stream源码中flatmap的方法定义: Stream flatMap(Function super T, ? extends Stre...

weixin_33785971的博客 1754
上一篇: Java 线程池
下一篇: MySQL中FIND_IN_SET()函数与IN()的区别与使用
快乐吃手手  :  )
博客等级 码龄6年 119粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值