JDK8-2-流(2.2)- 流操作-flatMap

JDK8 Stream流实战:从集合操作到函数式编程的5个经典案例 本文通过5个源自真实项目的经典案例,深入解析了JDK8 Stream流如何将复杂的集合操作与函数式编程思想结合,实现代码的优雅重构与性能优化。内容涵盖数据扁平化、复杂分组、自定义归约、并行流使用陷阱及无限流构建,帮助开发者掌握从命令式到声明式的编程范式转变,提升数据处理效率与代码可维护性。 阅读详情

JDK8-2-流(2.2)- 流操作-flatMap

flatMap (流的扁平化处理)

例1

假设有一个需求,需要将 [“Hello”,“World”] 字符串数组转换成没有重复字母的单个字母组成的字符串数组 [“H”,“e”,“l”, “o”,“W”,“r”,“d”],如何处理呢,有可能第一想法是使用 map 处理,但是map其实不能达到想要的效果,它会使集合嵌套,如下:

List<List<String>> result2 = Arrays.stream(WORDS)
                .map(str -> Arrays.asList(str.split("")))
                .collect(Collectors.toList());

使用 flatMap 处理

public static void flatMapTest1() {
    List<String> result = Arrays.stream(WORDS)
            .map(str -> str.split(""))
            .flatMap(Arrays::stream)
            .distinct()
            .collect(Collectors.toList());
    System.out.println(result);
}

flatmap方法可以把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流,以上例说明,就是将 String [] 转换成 Stream <String> 然后合并这两个流。

flatMap 定义

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

flatMap 方法效果图

在这里插入图片描述

例2

给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。

代码如下:
c 代表数对 int[] 的集合,d 表示将数对转换成字符串的集合

List<Integer> a = Arrays.asList(1, 2, 3);
List<Integer> b = Arrays.asList(3, 4);
List<int[]> c = a.stream().flatMap(i -> b.stream().map(j -> new int[]{i, j})).collect(Collectors.toList());
List<String> d = c.stream()
        .map(arr -> new StringJoiner(",", "(", ")").add(Integer.toString(arr[0])).add(Integer.toString(arr[1])).toString())
        .collect(Collectors.toList());
System.out.println(d);

结果:

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

相关推荐

HBuilderX结合Android Studio实现Uniapp安卓Apk高效离线打包指南

本文提供了一份详细的Uniapp安卓Apk离线打包实战指南。通过整合HBuilderX与Android Studio,手把手教你搭建本地编译环境、配置原生工程、执行核心打包流程,并分享快速更新资源和排查常见问题的技巧,助你彻底摆脱云端打包的排队依赖,实现高效、可控的应用构建。

weixin_28835551的博客 549

JDK8特性:Stream流操作中的map()与 flatMap()

(1)map(),对集合中的元素逐个进行函数操作映射成另外一个。(2)flatMap,接收一个函数作为参数,将流中的每个值都转换为另一个流,然后把所有的流都连接成一个流。

Newbie的专栏 7678

【QT】QtCreator卸载与安装(非正常状态)

QtCreator卸载与安装(非正常状态)

Cappuccino Blog 1万+

java8-stream-flatMap方法简单使用

其中,flatMap()方法也是其中的API,flatMap()简单来说就是将多个stream流合并成一个stream,流变得扁平化, 当然你也可以在合并的时候结合其他的API做一些过滤或者转换之类的,如filter,下面详细阐述一下。在JDK8开始,列表操作新增了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑;>>,不用flatMap扁平化处理,依然可以使用 filter,map,collect对流做操作。

glProgramming的博客 7120

向量数据库:PGVector

PGVector 是一个基于 PostgreSQL 的扩展插件,为用户提供了一套强大的向量存储和查询的功能

m0_37559973的博客 1万+

数据科学常见模型总结(二)-倾向性得分匹配模型

PSM的核心思想是从未受干预的用户群体中,找到和干预对象一模一样的用户,这样就可以把因果效应归因到干预上。

wudelong0112的专栏 4881

Java8 FlatMap的使用

有图有真相~

杨幂等 2万+

SuperPoint与SuperGlue的C++ TensorRT工程化实战:从理论到部署的完整指南

本文详细介绍了如何将SuperPoint和SuperGlue算法通过C++和TensorRT进行工程化部署,从模型准备、格式转换到TensorRT引擎构建和C++推理实现。通过性能优化技巧和实际应用案例,展示了在边缘设备上实现实时特征匹配的完整流程,显著提升处理速度与效率。

weixin_42537831的博客 159

面试被问到的jdk8中map和flatMap的区别

背景 说到 Java 8 map 和 flatMap 的区别,大部分人都答不上来,会用 map 的都不多,还有一部分人甚至都不知道这两个玩意是干嘛用的,有的还以为我问 HashMap 和 FlatMap。。 这里所问的 map 和 flatMap 并不是集合,它们都是 Stream 流接口中的方法,如果你没用过,我估计在座的各位也有点晕! 在 Java 8 Stream(流)接口中有 8 个特别有意思的方法,其实就是分为两大类: map flatMap 现在知道这两个玩意的来路了吧? map map 方

程小明的博客 674

YOLOv8 PCB缺陷检测系统全流程实战:从开发到UI展示详解

毕设路上难免有波折,但只要跟着这个教程把“数据集处理、模型训练、UI开发”每一步都落实,你就已经超越了大多数同学。这个“PCB缺陷检测系统”既有技术深度(YOLOv8是工业级主流算法),又有工程价值(解决电子制造的实际痛点),还具备出色的可视化展示——这样的毕设,拿高分是水到渠成的事。

FJN110的博客 213

全面解读 SAP Business Data Cloud

SAP 在 2025 年初正式推出(简称BDC),它把、以及全新的统一封装为一项完全托管的 SaaS 服务,配套交付“语义层 + 数据产品 + 智能应用”三层能力,为企业构建真正贴近业务语境的 “Business Data Fabric”。这一方案不仅解决了跨系统数据碎片化、治理难及 AI 训练数据可信度低的问题,还为现有 BW 客户、S/4HANA以及第三方工作负载提供云上现代化路径和零拷贝数据共享机制。本文将围绕技术架构、核心组件、业务场景、迁移路线及未来展望展开,以 Henkel 等真实案例佐证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 899

JDK8-2-流(2)- 流操作

上篇中简单介绍了什么是流以及使用流的好处,本篇主要介绍流的操作类型以及如何操作。

sql2008help的博客 413

NVIDIA Isaac Lab 入门教程(一)

Isaac Lab 是一个用于机器人学习的统一模块化框架,旨在简化机器人研究中的常见工作流程(如 RL、从演示中学习和运动规划)。它建立在英伟达 Isaac Sim 的基础上,利用最新的仿真功能实现逼真的场景和快速高效的仿真。该框架的核心目标是Isaac Lab 的主要功能包括:由 PhysX 提供的快速准确的物理模拟、用于矢量化渲染的平铺渲染 API、用于提高鲁棒性和适应性的域随机化,以及对在云中运行的支持。有关该框架的更多信息,请参阅论文[MYY+23]。

机器人控制与仿真应用 8214

jdk1.8中使用Stream流

什么是Stream流 这里说明一下,Stream流不像传统的java.io中的inputStream和outputStream流,在jdk8中Stream是对集合Connection的增强,Stream比传统的流更加的精炼,语法更加的简洁。 我们为什么使用Stream流 Stream流大大减少对io的频繁操作,并且有着非常不错的性能,连亚马逊对大量数据的分析也是用的Stream流,只需要写少量的代...

技术无止境 5496

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Camera2Demo

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

常见的jdk8流操作总结

流操作可以分为两类:中间操作和终端操作  中间操作:又可以分为有状态和无状态两种 定义:一个流可以后面跟随零个或多个中间操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。  终端操作:又可以分为短路和非短路两种 定义: 一个流只能有一...

qq_27661881的博客 619

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

讲一下JDK8中Stream流

讲一下JDK8中Stream流详解 一、简介 首先,Stream流是JDK8中加入的,主要是为了解决日常开发中编写复杂的代码。通过结合Lambda表达式可以完美的写出简洁高效的代码,Stream流分为三个阶段:开始–>中间–>结束。 一个流只能被操作一次(调用中间流或终端流操作)。例如,这就排除了“分叉”流,即同一个源为两个或多个管道提供数据,或者同一个流的多次遍历。如果流实现检测到流正在被重用,它可能会抛出illeglastateException。然而,由于一些流操作可能返回其接收器而不是新

weixin_43322048的博客 543

java8 stream中map与flatMap的区别

latMap与map的区别在于* flatMap是将一个流中的每个值都转成一个个流,然后再将这些流扁平化成为一个流 。举例如下: String[] strs = {“java8”, “is”, “easy”, “to”, “use”}; List&lt;String[]&gt; distinctStrs = Arrays.stream(strs) ...

南来北往的客 3740

jdk1.8 flatMap使用

用法:Stream.of(T… values).flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) 基本数据类型 import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import java.util.stream.St.

weixin_43864927的博客 1712

JDK8的Optional类中map方法和flatMap方法的区别

文章目录1、源码2、例子 先说结论:两种的区别是map的返回值Optional对象是在map方法里面自动封装好了。而flatMap方法是自己的实现的逻辑中自己封装。 1、源码 public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent())

可乐多点冰的博客 4003

Jdk8 常用的流操作

jdk8 常用流操作

小羊的 Blog 465

JDK8 集合 Stream 入门

参考:https://stackoverflow.com/questions/51047522/how-to-auto-increment-the-key-of-a-hashmap-using-collectors-and-stream-in-java-8。本文所说的stream 跟java IO 里的stream有点区别, 虽然都是流的意思, 但本文所写的stream 是指 JDK8 API的新成员(还有lambda 和 try-with-resource) , 它允许以生命的方式处理数据集合。

nvd11的专栏 920

JDK8新特性05:Stream操作

JDK8新特性05:Stream操作Stream概述Stream组成Stream的使用示例Stream的优势Stream的使用Stream的创建Stream的中间操作`filter()`: 对流进行过滤`map()`与`flatMap()`:对流中的元素进行映射`skip()`,`limit()`:对流进行分页`sorted()`:对流排序`distinct()`:对流中的元素进行去重Stream...

ncepu_Chen的博客 958

Java8 Stream流操作最强详解版

Java8 Stream流操作最强详解版

qq_42003527的博客 3208

java8中stream的map和flatmap的理解

https://www.cnblogs.com/lijingran/p/8727507.html 假如我们有这样一个需求给定单词列表["Hello","World"],你想要返回列表["H","e","l", "o","W","r","d"], 对于这样的需求,我们可能想到的第一个版本可能是这样子的: words.stream() .map(word -> word.split("")) .distinct() .collect(toList()); 这个方法的问题在于,传递给map方法的La

liyanlei的专栏 1022

Java JDK1.8 核心特性详解------Stream(流)的使用

在前面的章节(Java JDK1.8 核心特性详解------Stream(流)的基本介绍),我讲述了流的基本介绍,包括流的一些特性以及简单的用法。在下面这篇文章里,我们会更加具体的学习如何使用Stream对数据进行筛选、映射、查找、匹配、归约等基本功能,以及如何用新的方式创建流。 目录 流的基本使用 筛选 映射 查找和匹配 数值流 构建流 流的基本使用 下面这个List是后面...

苏暮沉觞的博客 1738

java stream flatMap的使用及个人理解

其中flatmap流中间操作api,我认为简单来说是对“集合中的集合的操作和展开”。比如说,一个对象集合里面的每个对象还有个集合对象。这时,我们如果需要对这个集合的所有对象的集合对象进行操作,那么flatmap就是一个不错的选择。这个p就是有人对象,我们把每个人对象里面的房子的集合通过map返回地址这个字符串流,就是一个展开操作,最后再收集所有人的地址流,统一返回字符串。2.接下来举个例子,比如有一群人的每个人都有多套房子,我想把这群人的所有房子的地址都去重的统计出来。再定义一个房子bigHouse类。

7071
上一篇: JDK8-2-流(2.1)- 流操作-distinct
下一篇: JDK8-2-流(2.3)- 流操作-reduce (归约)
sql2008help
博客等级 码龄11年 80粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值