0

0

如何使用 Project Reactor 创建 Flux 和 Mono 序列

冷炫風刃

冷炫風刃

发布时间:2026-01-07 14:35:20

|

442人浏览过

|

来源于php中文网

原创

Project Reactor 提供 Mono 和 Flux 两种响应式序列,可通过静态工厂方法(如 just、empty)、异步操作(fromCallable、fromFuture)、边界处理(defer、onErrorResume)及组合转换(zip、flatMap、concat)等方式创建与管理。

如何使用 project reactor 创建 flux 和 mono 序列 - php中文网

Project Reactor 是 Spring WebFlux 的核心响应式编程库,提供 Mono(0 或 1 个元素)和 Flux(0 到 N 个元素)两种响应式序列类型。创建它们的关键在于选择合适的静态工厂方法,并理解其语义差异。

从静态工厂方法创建基础序列

Reactor 提供了大量静态方法用于快速构建常见场景的序列:

  • Mono.just(value):发出单个非 null 值,例如 Mono.just("hello")
  • Mono.empty():发出 onComplete 信号,不发射任何数据
  • Mono.error(exception):立即发出 onError 信号
  • Flux.just(a, b, c):按顺序发出多个值,如 Flux.just(1, 2, 3)
  • Flux.fromArray(array)Flux.fromIterable(list):将集合或数组转为流
  • Flux.range(start, count):生成整数序列,如 Flux.range(1, 5) 发出 1~5

从异步操作创建响应式序列

实际开发中,多数数据来自 I/O 或计算密集型任务,需用异步方式创建序列:

  • Mono.fromCallable(() -> doSyncWork()):在订阅时执行一次同步计算,结果封装为 Mono
  • Mono.fromFuture(completableFuture):包装已存在的 CompletableFuture
  • Flux.fromStream(() -> Stream.generate(...)):注意需配合 .take(n) 控制长度,避免无限流
  • Flux.interval(Duration.ofSeconds(1)):每秒发出一个递增的 long 值(从 0 开始),常用于定时任务

延迟、错误与空值处理的常见写法

创建序列时要主动考虑边界情况,避免运行时异常:

Android 开发者指南 第一部分:入门
Android 开发者指南 第一部分:入门

Android文档-开发者指南-第一部分:入门-中英文对照版 Android提供了丰富的应用程序框架,它允许您在Java语言环境中构建移动设备的创新应用程序和游戏。在左侧导航中列出的文档提供了有关如何使用Android的各种API来构建应用程序的详细信息。第一部分:Introduction(入门) 0、Introduction to Android(引进到Android) 1、Application Fundamentals(应用程序基础) 2、Device Compatibility(设备兼容性) 3、

下载
  • 避免 null 入参:如 Mono.just(null) 会抛出 NullPointerException;应改用 Mono.justOrEmpty(Optional.ofNullable(value))Mono.empty()
  • 延迟创建逻辑:使用 Mono.defer(() -> Mono.just(...)) 确保每次订阅都重新执行创建逻辑,适用于有状态或时间敏感的数据源
  • 容错初始化:若构造过程可能失败,用 Mono.fromCallable(...).onErrorReturn(defaultValue).onErrorResume(e -> fallbackMono)
  • 空集合安全转换:对可能为空的 List,推荐 list != null && !list.isEmpty() ? Flux.fromIterable(list) : Flux.empty(),或用 Flux.fromIterable(Optional.ofNullable(list).orElse(Collections.emptyList()))

组合与转换已有序列

多数真实业务不会只靠“创建”,而是组合多个序列形成新流:

  • 合并两个 Mono:用 Mono.zip(m1, m2, (a, b) -> new Pair(a, b)) 并发等待两者完成
  • 扁平化嵌套 Flux:如 Flux> source → source.flatMap(m -> m)
  • 串联多个 Flux:用 Flux.concat(f1, f2, f3) 按顺序订阅,前一个完成才开始下一个
  • 条件性创建:用 Mono.fromSupplier(() -> condition ? value : null).filter(Objects::nonNull) 实现 if-else 式流分支

掌握这些创建方式后,就能根据数据来源(内存对象、同步方法、Future、定时器、集合等)准确选用对应 API。关键是理解每个工厂方法的触发时机(立即执行 vs 延迟执行)、错误传播行为和空值约定。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

101

2025.08.06

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

720

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.11.20

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

3

2026.01.08

java学习网站汇总
java学习网站汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号