Project Reactor中 map、flatMap、concatMap 和 flatMapSequential 的区别

news/2025/2/26 13:28:27

Project Reactor(Reactive Streams 的实现库,常用于 Spring WebFlux)中,mapflatMapconcatMapflatMapSequential 是常用的操作符,但它们的功能和行为有显著区别。以下是它们的详细对比:


1. 功能对比

操作符功能描述输入类型输出类型顺序性并发性
map同步转换元素元素(T元素(R保持顺序无并发
flatMap异步转换元素为 Publisher,并发处理所有 Publisher元素(TPublisher(Publisher<R>不保证顺序并发
concatMap异步转换元素为 Publisher,按顺序处理 Publisher元素(TPublisher(Publisher<R>保持顺序无并发
flatMapSequential异步转换元素为 Publisher,并发处理 Publisher,但按顺序发射结果元素(TPublisher(Publisher<R>保持顺序并发

2. 行为对比

map
  • 作用:将 Flux 或 Mono 中的每个元素同步转换为另一个元素。
  • 特点
    • 同步操作。
    • 不改变流的类型(例如,Flux 仍然是 Flux,Mono 仍然是 Mono)。
  • 示例
    java">Flux<Integer> flux = Flux.just(1, 2, 3);
    flux.map(value -> value * 10)
        .subscribe(System.out::println);
    
    输出
    10
    20
    30
    
flatMap
  • 作用:将 Flux 或 Mono 中的每个元素异步转换为一个 Publisher(如 Flux 或 Mono),并并发处理这些 Publisher。
  • 特点
    • 异步操作。
    • 改变流的类型(例如,将 Flux 转换为另一个 Flux)。
    • 不保证顺序。
  • 示例
    java">Flux<Integer> flux = Flux.just(1, 2, 3);
    flux.flatMap(value -> 
        Mono.just(value * 10).delayElement(Duration.ofMillis(100)) // 异步转换
    ).subscribe(System.out::println);
    
    输出(可能无序):
    10
    20
    30
    
concatMap
  • 作用:将 Flux 或 Mono 中的每个元素异步转换为一个 Publisher(如 Flux 或 Mono),并按顺序连接这些 Publisher。
  • 特点
    • 异步操作。
    • 改变流的类型(例如,将 Flux 转换为另一个 Flux)。
    • 按顺序处理 Publisher。
  • 示例
    java">Flux<Integer> flux = Flux.just(1, 2, 3);
    flux.concatMap(value -> 
        Mono.just(value * 10).delayElement(Duration.ofMillis(100)) // 异步转换
    ).subscribe(System.out::println);
    
    输出
    10
    20
    30
    
flatMapSequential
  • 作用:将 Flux 或 Mono 中的每个元素异步转换为一个 Publisher(如 Flux 或 Mono),并发处理这些 Publisher,但按顺序发射结果。
  • 特点
    • 异步操作。
    • 改变流的类型(例如,将 Flux 转换为另一个 Flux)。
    • 并发处理,但按顺序发射结果。
  • 示例
    java">Flux<Integer> flux = Flux.just(1, 2, 3);
    flux.flatMapSequential(value -> 
        Mono.just(value * 10).delayElement(Duration.ofMillis(100)) // 异步转换
    ).subscribe(System.out::println);
    
    输出
    10
    20
    30
    

3. 适用场景

操作符适用场景
map简单的同步转换操作,例如将字符串转换为大写、将数字乘以某个值等。
flatMap需要并发处理的异步操作,且不关心顺序,例如并发请求多个外部服务。
concatMap需要异步操作且保持顺序的场景,例如按顺序插入数据库记录。
flatMapSequential需要并发处理但结果顺序重要的场景,例如并发请求多个外部服务但按顺序返回结果。

4. 性能与资源消耗

操作符性能与资源消耗
map同步操作,性能开销小。
flatMap异步操作,性能开销较大,适合高并发场景。
concatMap异步操作,性能开销较大,顺序性可能导致性能瓶颈。
flatMapSequential异步操作,性能开销较大,适合需要并发处理但结果顺序重要的场景。

总结

  • map:用于同步的元素转换,适合简单的数据处理。
  • flatMap:用于异步的元素转换,并发处理所有 Publisher,适合高并发场景。
  • concatMap:用于异步的元素转换,按顺序处理 Publisher,适合需要顺序性的场景。
  • flatMapSequential:用于异步的元素转换,并发处理 Publisher 但按顺序发射结果,适合需要并发处理且结果顺序重要的场景。

http://www.niftyadmin.cn/n/5868764.html

相关文章

SOME/IP-SD -- 协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…

Para-Lane: 首个真实世界多车道数据集,目的评估自动驾驶系统中的新型视角合成能力。

2025-02-22&#xff0c;阿里巴巴集团菜鸟自动驾驶实验室和百度研究院共同创建了一个名为 Para-Lane 的真实世界多车道数据集。该数据集目的评估自动驾驶系统中的新型视角合成&#xff08;NVS&#xff09;能力&#xff0c;通过提供大量真实世界的数据&#xff0c;弥补了现有合成…

【大模型】Ubuntu下 fastgpt 的部署和使用

前言 本次安装的版本为 fastgpt:v4.8.8-fix2。 最新版本fastgpt:v4.8.20-fix2 问答时报错&#xff0c;本着跑通先使用起来&#xff0c;就没有死磕下去&#xff0c;后面bug解了再进行记录。   github连接&#xff1a;https://github.com/labring/FastGPT fastgpt 安装说明&…

jdk21下载、安装(Windows、Linux、macOS)

Windows 系统 1. 下载安装 访问 Oracle 官方 JDK 下载页面 或 OpenJDK 下载页面&#xff0c;根据自己的系统选择合适的 Windows 版本进行下载&#xff08;通常选择 .msi 安装包&#xff09;。 2. 配置环境变量 右键点击 “此电脑”&#xff0c;选择 “属性”。 在左侧导航栏…

vLLM专题(十四)-自动前缀缓存

一、介绍 自动前缀缓存(Automatic Prefix Caching,简称 APC)缓存现有查询的 KV 缓存,以便新查询如果与现有查询共享相同的前缀,可以直接重用 KV 缓存,从而跳过共享部分的计算。 注意 有关 vLLM 如何实现 APC 的技术细节,请参阅此处。 二、在 vLLM 中启用 APC 在 vLLM …

防火墙双机热备---VRRP,VGMP,HRP(超详细)

双机热备技术-----VRRP&#xff0c;VGMP&#xff0c;HRP三个组成 注&#xff1a;与路由器VRRP有所不同&#xff0c;路由器是通过控制开销值控制数据包流通方向 防火墙双机热备&#xff1a; 1.主备备份模式 双机热备最大的特点就是防火墙提供了一条专门的备份通道&#xff08;心…

low rank decomposition如何用于矩阵的分解

1. 什么是矩阵分解和低秩分解 矩阵分解是将一个矩阵表示为若干结构更简单或具有特定性质的矩阵的组合或乘积的过程。低秩分解&#xff08;Low Rank Decomposition&#xff09;是其中一种方法&#xff0c;旨在将原矩阵近似为两个或多个秩较低的矩阵的乘积&#xff0c;从而降低复…

网络安全防御:蓝队重保备战与应急溯源深度解析

课程目标 本课程旨在培养专业的网络安全蓝队成员&#xff0c;通过系统化的学习和实战演练&#xff0c;使学员能够掌握网络安全防御的核心技能&#xff0c;包括资产测绘、应急响应、系统安全应急溯源分析、网络层溯源分析以及综合攻防演练等。学员将能够熟练运用各种工具和技术…