响应式编程——初识 Flux 和 Mono
by emanjusaka from https://www.emanjusaka.top/archives/4 彼岸花开可奈何
本文欢迎分享与聚合,全文转载请留下原文地址。
前言
Reactor 是一个响应式编程的基础类库,其中有两个很关键的类:Flux 和 Mono。掌握这两个类和相关概念有助于我们学习响应式编程。
Flux 和 Mono 都是数据流的发布者,使用 Flux 和 Mono 都可以发出三种数据信号:元素值,错误信号,完成信号;错误信号和完成信号都代表终止信号,终止信号用于告诉订阅者数据流结束了,错误信号终止数据流同时把错误信息传递给订阅者。
一、Flux
具有 rx 运算符的响应式流发布器,发出 0 到 N 个元素,然后完成(成功或有错误)。
下图显示了 Flux 如何转换项目:

Flux是一个标准的Publisher,表示一个异步的0到N个发出的项目序列,可选择终止于完成信号或错误信号。根据Reactive Streams规范,这三种类型的信号转换为对下游Subscriber的onNext、onComplete和onError方法的调用。
由于可能出现的信号范围很大,Flux是通用的响应式类型。请注意,所有事件,包括终止事件,都是可选的:没有onNext事件但有onComplete事件表示一个空的有限序列,但如果去掉onComplete,则得到一个无限的空序列(除了用于取消测试之外,不是特别有用)。同样,无限序列不一定为空。例如,Flux.interval(Duration)会生成一个无限的Flux,从时钟发出定期的滴答声。Flux 是标准的 Publisher,它表示 0 到 N 个发出项的异步序列,可以选择由完成信号或错误终止。与 Reactive Streams 规范中一样,这三种类型的信号转换为对下游订阅者的 onNext、onComplete 和 onError 方法的调用。
凭借如此大范围的可能信号,Flux 是通用的无功类型。请注意,所有事件,甚至终止事件,都是可选的:没有 onNext 事件,但 onComplete 事件表示一个空的有限序列,但删除 onComplete 并且您有一个无限的空序列(不是特别有用,除了围绕取消的测试)。同样,无限序列不一定是空的。例如, Flux.interval(Duration) 生成无限的 Flux 并从时钟发出规则的滴答声。
二、Mono
具有基本 rx 运算符的 Reactive Streams Publisher 通过 onNext 信号最多发出一项,然后以 onComplete 信号终止(成功的 Mono,有或没有值),或者仅发出单个 onError 信号(失败的 Mono)。
下图显示了 Mono 如何转换项目:

Mono是一种特殊的Publisher,通过onNext信号发出最多一个项目,然后通过onComplete信号终止(成功的Mono,有或没有值),或者只发出一个onError信号(失败的Mono)。
大多数Mono实现在调用onNext后立即调用其Subscriber的onComplete。Mono.never()是一个例外:它不发出任何信号,在技术上并不禁止,但在测试之外没有太大用处。另一方面,明确禁止使用onNext和onError的组合。
Mono只提供了Flux可用的操作符的子集,而某些操作符(特别是将Mono与另一个Publisher组合的操作符)会切换到Flux。例如,Mono#concatWith(Publisher)返回一个Flux,而Monothen(Mono)返回另一个Mono。
请注意,您可以使用Mono来表示只有完成概念的无值异步过程(类似于Runnable)。要创建一个,您可以使用一个空的Mono。
三、代码示例
创建一个Flux,发出一系列字符串元素并订阅打印出来:
package top.emanjusaka;
import reactor.core.publisher.Flux;
public class Main {
public static void main(String[] args) {
Flux<String> flux = Flux.just("Hello", "emanjusaka", "!");
flux.subscribe(System.out::println);
}
} // 输出
Hello
emanjusaka
!
创建一个Mono,发出一个字符串元素并订阅打印出来:
package top.emanjusaka;
import reactor.core.publisher.Mono;
public class Main {
public static void main(String[] args) {
Mono<String> mono = Mono.just("Hello");
mono.subscribe(System.out::println);
}
} // 输出
Hello
使用Flux的操作符进行元素转换和过滤:
package top.emanjusaka; import reactor.core.publisher.Flux; public class Main {
public static void main(String[] args) {
Flux<Integer> numbers = Flux.range(1, 10);
numbers.map(num -> num * 2)
.filter(num -> num % 3 == 0)
.subscribe(System.out::println);
}
} // 输出
6
12
18
使用Mono的操作符进行元素转换和错误处理:
package top.emanjusaka; import reactor.core.publisher.Mono; public class Main {
public static void main(String[] args) {
Mono<Integer> number = Mono.just(5);
number.map(num -> num * 2)
.doOnError(Throwable::printStackTrace)
.subscribe(System.out::println);
}
} // 输出
10
四、总结
Flux 和 Mono 都是位于 reactor.core.publisher包下的类。
Reactor中的Flux和Mono是用于实现响应式编程的两种基本类型:
- Flux:表示一个异步序列,可以发出0到N个项目。它可以终止于完成信号或错误信号。Flux适用于处理多个项目的情况,可以使用各种操作符来处理和转换序列。
- Mono:表示一个异步序列,最多发出一个项目。它要么终止于完成信号(有或没有值),要么只发出一个错误信号。Mono适用于处理单个项目的情况,也可以使用一些操作符来处理和转换序列。
这两种类型都是Publisher的实现,遵循Reactive Streams规范,并可以与其他响应式库和框架进行互操作。
Flux和Mono都可以表示无限序列,也可以表示空序列。它们提供了丰富的操作符来处理和转换序列,例如映射、过滤、合并、扁平化等。此外,它们还支持异步和并发处理,可以与其他操作符和操作进行组合使用。
总的来说,Flux适用于处理多个项目的情况,而Mono适用于处理单个项目的情况。它们是Reactor中用于实现响应式编程的基本类型,提供了丰富的操作符和功能来处理和转换异步序列。
五、参考文献
本文原创,才疏学浅,如有纰漏,欢迎指正。尊贵的朋友,如果本文对您有所帮助,欢迎点赞,并期待您的反馈,以便于不断优化。
原文地址: https://www.emanjusaka.top/archives/4
微信公众号:emanjusaka的编程栈
响应式编程——初识 Flux 和 Mono的更多相关文章
- 学习响应式编程 Reactor (3) - reactor 基础
Reactor Reactor 项目的主要 artifact 是 reactor-core,这是一个基于 Java 8 的实现了响应式流规范的响应式库. Reactor 提供了实现 Publisher ...
- 学习响应式编程 Reactor (2) - 初识 reactor
Reactor Reactor 是用于 Java 的异步非阻塞响应式编程框架,同时具备背压控制的能力.它与 Java 8 函数式 Api 直接集成,比如 分为CompletableFuture.Str ...
- springboot2 webflux 响应式编程学习路径
springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑问将会成为未来技术的趋势,是必学 ...
- 响应式编程系列(一):什么是响应式编程?reactor入门
响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响 ...
- (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...
- Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统 ...
- springboot(二十三)Springboot2.X响应式编程
序言 Spring WebFlux是Spring Framework 5.0中引入的新的反应式Web框架与Spring MVC不同,它不需要Servlet API,完全异步和非阻塞,并 通过React ...
- SpringBoot使用WebFlux响应式编程操作数据库
这一篇文章介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库. 前言 在之前一篇简单介绍了WebFlux响应式编程的操作,我们在来看一下下图,可以看到,在目前的Spring ...
- [转]springboot2 webflux 响应式编程学习路径
原文链接 spring官方文档 springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑 ...
- 【SpringBoot】SpringBoot2.0响应式编程
========================15.高级篇幅之SpringBoot2.0响应式编程 ================================ 1.SprinBoot2.x响应 ...
随机推荐
- C#/VB.NET:如何从 PowerPoint 演示文稿中提取文本
在学习或者日常工作中,有时我们需要把幻灯片的东西整理成文字,而从 PowerPoint 演示文稿中一张一张的整理手动复制粘贴,整个过程会非常费精力且耗时.那么怎么样才能比较轻松且快速地提取PowerP ...
- python基础:重新认识装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- 发现了阿里云 APP 的一个小 BUG
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 前几天在华为手机上使用阿里云 APP,从 oss bucket 中下载了一张图片,想要通过微信 ...
- 逍遥自在学C语言 | break-循环的中断与跳转
前言 在C语言中,break语句是一种控制流语句,它用于终止当前所在的循环结构(for.while.do-while)或者switch语句,从而跳出循环或者结束switch语句的执行. 一.人物简介 ...
- CMU15445 (Fall 2020) 之 Project#1 - Buffer Pool 详解
前言 去年暑假完成了 CMU15-445 Fall 2019 的四个实验,分别对应下述博客: CMU15445 (Fall 2019) 之 Project#1 - Buffer Pool 详解 CMU ...
- Reactor 模式与Tomcat中的Reactor
系列文章目录和关于我 参考:[nio.pdf (oswego.edu)](https://gee.cs.oswego.edu/dl/cpjslides/nio.pdf) 一丶什么是Reactor Th ...
- Python编程和数据科学中的大数据分析:如何从大量数据中提取有意义的信息和模式
目录 <Python编程和数据科学中的大数据分析:如何从大量数据中提取有意义的信息和模式> 引言 大数据时代已经来临,随着互联网和物联网的普及,海量数据的产生和存储已经成为一种普遍的现象. ...
- Python运维开发之路《函数进阶》
面向对象类的进阶 抽象类 python 没有抽象类.接口的概念,所以要实现这种功能需要导入abc模块 py2:导入abc函数,_metaclass__ = abc.ABCMeta;在强制调用类下:@a ...
- C++面试八股文:如何避免死锁?
某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官:什么是锁?有什么作用? 二师兄:在C++中,锁(Lock)是一种同步工具,用于保护共享资源,防止多个线程同时访问,从而避免数据竞争 ...
- AcWing 第87场周赛题解
T1 移动棋子 算出数值为 \(1\) 的点离 \((3, 3)\) 的距离即可. #include <iostream> #include <cstring> #includ ...