响应式编程——初识 Flux 和 Mono

这篇具有很好参考价值的文章主要介绍了响应式编程——初识 Flux 和 Mono。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

by emanjusaka from ​ https://www.emanjusaka.top/2023/08/reactive-programming-flux-mono 彼岸花开可奈何
本文欢迎分享与聚合,全文转载请留下原文地址。

前言

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

三、代码示例

  1. 创建一个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
    !
    
  2. 创建一个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
    
  3. 使用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
    
  4. 使用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是用于实现响应式编程的两种基本类型:

  1. Flux:表示一个异步序列,可以发出0到N个项目。它可以终止于完成信号或错误信号。Flux适用于处理多个项目的情况,可以使用各种操作符来处理和转换序列。
  2. Mono:表示一个异步序列,最多发出一个项目。它要么终止于完成信号(有或没有值),要么只发出一个错误信号。Mono适用于处理单个项目的情况,也可以使用一些操作符来处理和转换序列。

这两种类型都是Publisher的实现,遵循Reactive Streams规范,并可以与其他响应式库和框架进行互操作。

Flux和Mono都可以表示无限序列,也可以表示空序列。它们提供了丰富的操作符来处理和转换序列,例如映射、过滤、合并、扁平化等。此外,它们还支持异步和并发处理,可以与其他操作符和操作进行组合使用。

总的来说,Flux适用于处理多个项目的情况,而Mono适用于处理单个项目的情况。它们是Reactor中用于实现响应式编程的基本类型,提供了丰富的操作符和功能来处理和转换异步序列。

五、参考文献

  1. 《Reactor》参考文档

本文原创,才疏学浅,如有纰漏,欢迎指正。尊贵的朋友,如果本文对您有所帮助,欢迎点赞,并期待您的反馈,以便于不断优化。

原文地址: https://www.emanjusaka.top/2023/08/reactive-programming-flux-mono

微信公众号:emanjusaka的编程栈文章来源地址https://www.toymoban.com/news/detail-697341.html

到了这里,关于响应式编程——初识 Flux 和 Mono的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu20.4 Mono C# gtk 编程习练笔记(三)

    Mono对gtk做了很努力的封装,即便如此仍然与System.Windows.Form中的控件操作方法有许多差异,这是gtk本身特性或称为特色决定的。下面是gtk常用控件在Mono C#中的一些用法。 在工具箱中该控件的clicked信号双击后自动生成回调函数prototype,下面的函数当Button12点击后其标签名变为

    2024年01月18日
    浏览(43)
  • Ubuntu20.4 Mono C# gtk 编程习练笔记(二)

    界面设计习练后,下面写一些程序设计心得。 先看一下程序总体结构,先在program.cs中找到main入口,在命名空间下是MainClass类,Main函数进入后首先建立应用程序环境 Application.Init,然后对MainWindow进行实例化,显示窗体并运行程序 Application.Run()。 main - application init - mainwindow{

    2024年01月21日
    浏览(44)
  • Ubuntu20.4 Mono C# gtk 编程习练笔记(一)

    Mono是Linux环境下C#的开发、编译及运行环境。gtk是gnome独具特色的图形库,Mono对它进行了C#封装。Linux环境下,许多的编程语言使用gtk界面库,有比较好的编程群众基础。另外,Mono相对于DOTNET来说要轻量许多,它们有着不同的定位,未来C# xamarin.forms定位在移动设备,现在Mono的

    2024年01月17日
    浏览(45)
  • SAR: 1 4 https://www.vulnhub.com/entry/sar-1%2C425/

    About Release Back to the Top Name : Sar: 1 Date release : 15 Feb 2020 Author : Love Series : Sar Download Back to the Top Please remember that VulnHub is a free community resource so we are unable to check the machines that are provided to us. Before you download, please read our FAQs sections dealing with the dangers of running unknown VMs and our suggesti

    2024年02月13日
    浏览(35)
  • 谷歌浏览器地址栏不显示http或者https://www.前缀解决办法

    可能与浏览器版本有关,可参考此版本 恢复完整版域名步骤: 1.打开 chrome://flags/ 2.找到 Omnibox on-focus suggestions for the contextual Web 改成 enabled 3…根据提示 relaunch 浏览器 4.右键地址栏 5.完成,刷新浏览器 可参考 http://www.taodudu.cc/news/show-4921051.html?action=onClick

    2024年02月08日
    浏览(49)
  • 解决Visual Studio 2019未能从“https://www.nuget.org/api/v2/package..“下载包问题

    今天从码云官网上下载了一个开源的.net项目,IDE使用的是VS2019,编译之前需要通过NuGet下载依赖的包,但是在下载依赖包的过程中出现了一系列问题。 这个问题主要是NuGet的源地址失效导致的,因此,要解决这个问题,主要是更改NuGet的源地址,更改方法如下: 1、打开Visua

    2024年02月16日
    浏览(63)
  • 我的TOP1编程语言

    作为一名程序员,选择一门厉害的编程语言确实很重要,那么,我的TOP1编程语言是什么呢?在我的眼中,Python是一门具有魔力且实用的编程语言,通过它的学习,我体会到了其易用性、强大的工具生态环境以及庞大的开发者社区所带来的种种红利。 在我看来,评选一门优秀

    2024年02月09日
    浏览(91)
  • HTTP 和 HTTPS(请求响应报文格式 + 请求方法 + 响应状态码 + HTTPS 加密流程 + Cookie 和 Session)

    HTTP 全称 “ 超文本传输协议 ”,是一种基于传输层 TCP 协议实现的应用非常广泛的 应用层协议 我们平时打开一个网站,就是通过 HTTP 协议来传输数据的 当我们在浏览器中访问一个 “ 网址 ”(URL),浏览器就会给这个 URL 的服务器发送一个 HTTP 请求,服务器返回一个 HTTP 响

    2023年04月19日
    浏览(44)
  • 72 内网安全-域横向CS&MSF联动及应急响应初识

    权限维持留到后面在补充,先把后面的知识点给大家讲起来,因为权限维持它是我们前期如果拿到权限之后,能做的事情,前期没有拿到权限的话,这个东西是个多余的技术,所以我们还是比较偏向于攻击方面,像权限维持是为了自身知识的全面性才讲的 CS和msf的联动,这个

    2024年02月03日
    浏览(41)
  • Qt网络编程post请求,数据格式为json或x-www-form-urlencoded

    目录 Qt网络编程post请求,数据格式为json或x-www-form-urlencoded 一、.H文件 1、.h头文件 2、.h主代码 二、.CPP文件 1、主代码  三、响应信息 返回结果(Josn数据格式输出) 四、Post数据格式参数及数据类型定义 1、Post:application/x-www-form-urlencoded数据类型格式 2、Post:application/json数据

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包