当前位置: 首页 > news >正文

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

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)。
  • 示例
    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)。
    • 不保证顺序。
  • 示例
    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。
  • 示例
    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)。
    • 并发处理,但按顺序发射结果。
  • 示例
    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 但按顺序发射结果,适合需要并发处理且结果顺序重要的场景。

相关文章:

  • 深度学习笔记线性代数方面,记录一些每日学习到的知识
  • Bugku CTF CRYPTO
  • 警惕将“数据标注”岗位包装为“大数据工程师”充数
  • LangGraph系列教程:基于状态构建上下文感知的AI系统
  • LeetCode 热题100 15. 三数之和
  • 宿主机的 root 是否等于 Docker 容器的 root?
  • C++的异步相关操作
  • YOLOv10 解析与地平线 征程 6 模型量化
  • 多线程基础系列-线程池
  • 洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数
  • 322.零钱兑换
  • Go语言--语法基础2--下载安装
  • AF3 DataPipeline类process_multiseq_fasta 方法解读
  • [数据结构笔记] 1. 顺序表 内含所有函数C语言代码,完全无伪代码
  • 使用串口工具实现tcp与udp收发
  • Leetcode2717:半有序排列
  • 【原创工具】同文件夹PDF文件合并 By怜渠客
  • 安全见闻4
  • 多功能免费网络测速及问题诊断工具
  • 【C++】:STL详解 —— vector类
  • 导航类网站模板/seo学徒
  • 家政服务公司网站源码/博客是哪个软件
  • 高中信息技术网站设计规划/快速网站推广优化
  • 电子商务网站建设与维护期末答案/今日财经新闻
  • 电子商务网站建设与管理答案/浙江专业网站seo
  • 房地产资讯/如何优化搜索引擎