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

Spring响应式编程之Reactor核心组件

Reactor核心组件

  • Flux和Mono组件
    • (1)Flux组件
    • (2)Mono组件

Flux和Mono组件

Reactor 框架提供了两个核心组件来发布数据,分别是 Flux 和 Mono 组件。两者都是实现Publisher接口的高级抽象,可以说是应用程序开发过程中最基本的编程对象。二者都可以被onComplete信号或者onError信号所终止。

(1)Flux组件

表示0到N个元素的异步序列,可以是有限的或无限的。

示例:

创建Flux

import reactor.core.publisher.Flux;public class FluxExample {public static void main(String[] args) {// 从静态数据创建Flux<String> flux1 = Flux.just("Hello", "World");// 从集合创建Flux<Integer> flux2 = Flux.fromIterable(Arrays.asList(1, 2, 3, 4, 5));// 生成动态数据Flux<Integer> flux3 = Flux.range(1, 10);// 创建无限流Flux<Long> flux4 = Flux.interval(Duration.ofSeconds(1));// 订阅Fluxflux1.subscribe(System.out::println);flux2.subscribe(System.out::println);flux3.subscribe(System.out::println);flux4.subscribe(System.out::println);}
}

操作Flux

import reactor.core.publisher.Flux;public class FluxOperationsExample {public static void main(String[] args) {Flux<Integer> flux = Flux.range(1, 10).filter(i -> i % 2 == 0) // 过滤偶数.map(i -> i * i)         // 映射到平方.doOnNext(System.out::println); // 打印每个元素flux.subscribe();}
}

(2)Mono组件

表示0到1个元素的异步序列,通常用于处理单个结果或空结果的情况。

示例:

创建Mono

import reactor.core.publisher.Mono;public class MonoExample {public static void main(String[] args) {// 从静态数据创建Mono<String> mono1 = Mono.just("Hello, Mono");// 创建空的MonoMono<String> mono2 = Mono.empty();// 创建包含错误的MonoMono<String> mono3 = Mono.error(new RuntimeException("An error occurred"));// 订阅Monomono1.subscribe(System.out::println);mono2.subscribe(System.out::println);mono3.subscribe(System.out::println, System.err::println);}
}

操作Mono

import reactor.core.publisher.Mono;public class MonoOperationsExample {public static void main(String[] args) {Mono<Integer> mono = Mono.just(10).map(i -> i * 2)       // 映射到双倍.doOnNext(System.out::println) // 打印元素.flatMap(i -> Mono.just(i / 2)); // 扁平映射mono.subscribe();}
}

某种程度上可以把 Mono 看作是 Flux 的一种特例,而两者之间也可以进行相互的转换和融合。如果你有两个 Mono 对象,那么把它们合并起来就能获取一个 Flux 对象。除此之外,把一个 Flux 转换成 Mono 对象也有很多办法,例如对一个 Flux 对象中所包含的元素进行计数操作就能得到一个 Mono 对象。

Flux和Mono对象的转换:

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;public class ConversionExample {public static void main(String[] args) {// Mono转FluxMono<String> mono = Mono.just("Hello, World");Flux<String> fluxFromMono = mono.flux();fluxFromMono.subscribe(System.out::println);// Flux转MonoFlux<Integer> flux = Flux.just(1, 2, 3, 4, 5);Mono<Integer> monoFromFlux = flux.next();monoFromFlux.subscribe(System.out::println);}
}

相关文章:

  • 网络聚合通信测试--自动化测试脚本
  • 6月20日(周四)A股行情总结:A股险守3000点,恒生科技指数跌1.6%
  • EVALUATE与XLWT与XLRD一种使用方式
  • 【机器学习300问】125、什么是双向循环神经网络(BRNN)?什么是深度循环神经网络(DRNN)?
  • 吴恩达机器学习 第二课 week4 决策树
  • 如何配置node.js环境
  • 软件设计师笔记-系统开发和运行知识(一)
  • 总结 CSS 选择器的常见用法
  • 硬盘数据恢复软件,推荐5种适合你的方法来恢复硬盘数据
  • 医学记录 --- 腋下异味
  • 手持弹幕LED滚动字幕屏夜店表白手灯接机微信抖音小程序开源版开发
  • 20-OWASP top10--XXS跨站脚本攻击
  • websocket 安全通信
  • 计算机组成入门知识
  • Memcached缓存系统详解
  • Docker: 容器互访的三种方式
  • ES2017异步函数现已正式可用
  • JavaScript函数式编程(一)
  • jquery ajax学习笔记
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • python3 使用 asyncio 代替线程
  • 缓存与缓冲
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (06)金属布线——为半导体注入生命的连接
  • (C语言)逆序输出字符串
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (第30天)二叉树阶段总结
  • (二)正点原子I.MX6ULL u-boot移植
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)visual stdio 书签功能介绍
  • .NET和.COM和.CN域名区别
  • .NET技术成长路线架构图
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • @requestBody写与不写的情况
  • [ 数据结构 - C++]红黑树RBTree
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [Android]Tool-Systrace
  • [c]扫雷
  • [C++]高精度 bign (重载运算符版本)
  • [CODE:-5504]没有[SYS.SYSOBJECTS]对象的查询权限
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [ES-5.6.12] x-pack ssl
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART