最近,需要快速使用Reactor的的两个类Flux和Mono中的的方法进行开发。在搜索半天之后,发现大部分都是一些转载的文章,笔者点了好几个不同的网站,看到的却是同一篇文章。

在此,笔者不讲过多的原理,以实践为主。

比如,讲一些笔者使用过的Flux&Mono中方法,以及这些方法的使用场景…..。

Flux&Mono的生产:

Flux是Reactor中的多元流,一次可以产生(发射)多个元素(对象)。类似于Java中的集合类(List)。

Mono是Reactor单个元素,一次只能产生0或者一个元素(对象)。类似于Java中的pojo普通对象。

接下来看看, 如何创建Flux&和Mono:

关于Flux的创建方式:just + generate + empty

Flux flux1 = Flux.just(Maps.newHashMap()); // 集合创建

Flux flux2 = Flux.just(1, 2, 3, 4); // 包装类创建

Flux flux3 = Flux.just("1", "2", "3"); // 字符串创建

Flux flux4 = Flux.empty(); // 返回一个空数据

// 使用generate方法创建

Flux.generate(create -> {

create.next("1"); // 每次只能接受一个值

create.next("2");

create.complete(); // 创建完成

});

复制代码关于Mono的创建:just + justOrEmpty + empty

Mono mono1 = Mono.just(Maps.newHashMap()); // 集合创建

Mono mono2 = Mono.just(1); // 包装类创建

Mono mono3 = Mono.just("1"); // 字符串创建

Mono.justOrEmpty(null); // 参数一个null或者非空的数据

Mono.justOrEmpty(1);

Mono.empty(); // 返回空数据

复制代码

Flux&Mono的消费:

不管是Flux还是Mono,创建之后需要触发消费逻辑,才能对产生的元素进行处理。

所以, 这里需要调用subscribe方法,才可以对产生的元素进行消费(处理)。

Flux flux2 = Flux.just(1, 2, 3, 4); // 包装类创建

flux2.subscribe(System.out::println);

// 打印结果:1 2 3 4

Mono Mono1 = Mono.just(1); // 包装类创建

Mono1.subscribe(System.out::println);

// 打印结果: 1

复制代码通过查看消费方法(subscribe)的的方法的参数列表,可以看出还存在多种的消费方式:

Consumer:消费逻辑, 可以传入系统处理函数, 可以传递自定义处理的Lambda表达式

errorConsumer:异常处理逻辑, 当产生异常的时候,需要传入的处理逻辑。

completeConsumer:完成处理逻辑,也叫完成信号。

思维类比:整个Flux&Mono生产和消费过程, 有点类似Java中的try-catch-finally

try -----Flux&Mono中的组合操作(filter、filterMap、zipWith…)

catch -----errorConsumer异常处理逻辑。

finally ----completeConsumer, 完成信号。

消费函数subscribe的使用:

下面是reactor中subscribe方法的两个重载。(当然还有些重载的subscribe方法,笔者也没怎么用过,所以在此就不罗列出来了)

// 消费一

public final Disposable subscribe(Consumer super T> consumer);

// 消费二:

public final Disposable subscribe(

@Nullable Consumer super T> consumer,

@Nullable Consumer super Throwable> errorConsumer,

@Nullable Runnable completeConsumer);

复制代码对于消费一的consumer, 我们可以传入一个函数(System.out::println),也可以传入一个Lamdba表达式。

消费一(上文)的consumer,传入item -> {}进行消费, 效果如下:

Flux.range(1, 10) // 产生 [1, 10]的整数

// 过滤

.map(item -> {

// 偶数翻倍

if(item % 2 == 0) {

return item * 2;

}

return item;

})

// 消费

.subscribe(item -> {

System.out.print(item + " ");

});

//打印结果:1 4 3 8 5 12 7 16 9 20

复制代码消费二多出errorConsumer, completeConsumer两个参数, 都可以传入landba表达式进行使用:

info -> log.error("这是一个异常, 信息为:", info):一般使用该方式进行记录异常

() -> { doSomething….}:作为完成信号。

Flux.range(1, 10)

// 过滤

.map(item -> {

// 偶数翻倍

if(item % 2 == 0) {

return item * 2;

}

return item;

})

// 消费

.subscribe(item -> {

System.out.print(item + " ");

}, info -> {

System.out.print("异常处理");

}, () -> {

System.out.println("完成处理");

});

// 打印结果:

// 1 4 3 8 5 12 7 16 9 20 完成处理

复制代码在上面的代码中,如果发生异常怎么办?在Flux&Mono中,异常处理&完成处理都属于终止信号, 所以程序一旦出现异常,那么就执行异常处理, 并不会执行完成处理。如果未出现异常, 则只有执行完成处理。

Flux.range(1, 10)

// 过滤

.map(item -> {

// 偶数翻倍

if(item == 7) { // 到7进行异常抛出

throw new RuntimeException();

}

return item;

})

// 消费

.subscribe(item -> {

System.out.print(item + " ");

}, info -> {

System.out.print("异常");

}, () -> {

System.out.println("完成");

});

// 1 2 3 4 5 6 异常

复制代码

组合处理:map&flatMap

两者都可以对Flux&Mono中的元素进行映射。

区别:

map:传入的表达式,可以返回一个普通的pojo对象。

flatMap:传入的表达式,只能返回一个Mono&Flux对象。

String[] arr = {"张三", "22"};

List arr2 = Arrays.asList(arr);

Flux.just(arr2)

.flatMap(obj -> {

P person = new P();

// 返回mono对象

return Mono.just(person);

}).map(obj -> {

P person = new P();

// 返回普通对象

return person;

}).subscribe();

复制代码

背压的概念:

流水线的概念:

在Flux&Mono中, 组合处理如果存在返回值, 那么该返回值是往下游(下一个组合处理)传递。

Flux.range(1, 10)

.flatMap(A -> {

return B;

}).map(B -> {

return C;

}).subscribe(C -> {

dosomething...

});

// 上游flatMap 返回B

// map接受的参数, 为B, 并返回C

// subscribe接受的参数为C

// 从上往下, 可以看做是一个流水线, flatMap&map可以看做是流水线上的工人,subscribe则是生产出来的产品。

复制代码

flux mono 转_自语之Reactor中FluxMono的粗略使用相关推荐

  1. java reactor框架_Java反应式框架Reactor中的Mono和Flux

    1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...

  2. flux java_Java反应式框架Reactor中的Mono和Flux

    1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...

  3. reactor p java_Java反应式框架Reactor中的Mono和Flux

    1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...

  4. Java反应式框架Reactor中的Mono和Flux,Java程序员必看

    由于响应流的特点,我们不能再返回一个简单的POJO对象来表示结果了.必须返回一个类似Java中的Future的概念,在有结果可用时通知消费者进行消费响应. Reactive Stream规范中这种被定 ...

  5. Reactor中文文档

    2019独角兽企业重金招聘Python工程师标准>>> Reactor 3 参考文档 Stephane Maldini @smaldini Simon Baslé @simonbas ...

  6. Reactor中的Thread和Scheduler

    文章目录 简介 Thread多线程 Schedule定时器 Schedulers工具类 publishOn 和 subscribeOn publishOn subscribeOn 简介 今天我们要介绍 ...

  7. linux ubuntu安装 mono,在Ubuntu 18.04系统中安装Mono及基本使用Mono的方法

    本文介绍在Ubuntu 18.04操作系统中安装Mono及基本使用Mono的方法.Mono是一个基于ECMA/ISO标准开发和运行跨平台应用程序的平台,它是Microsoft .NET框架的免费开源实 ...

  8. ios 图像翻转_在iOS 14中使用计算机视觉的图像差异

    ios 图像翻转 Human eyes are very receptive to visual representations. Similarly, computer vision enables ...

  9. ios 刷新遮罩遮罩_在Adobe XD中进行遮罩的3种方法

    ios 刷新遮罩遮罩 Are you new to Adobe XD? Or maybe you're just stuck on how to create a simple mask? Here ...

  10. ux的重要性_颜色在UX中的重要性

    ux的重要性 When coming up with a new digital solution (desktop, mobile, app, whatever it may be) or any ...

最新文章

  1. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)
  2. OpenAI探索机器人模拟训练新方法:仿真与真实世界无缝衔接
  3. syn flood dos
  4. 系统鸿蒙生态链,任正非透露鸿蒙系统细节,比安卓速度快60%,两三年建好生态链...
  5. openjudge 菲波那契数列 2753
  6. 安装fastdfs依赖包
  7. windows下curl
  8. 抖音api开放平台对接_抖音新增酒店预订等功能,一只脚踏进美团、携程腹地
  9. css 鼠标悬浮样式_【技术】CSS设置链接鼠标(失效)不能点样式
  10. 30名工程师,历时1300天打造,又一“国产”AI框架开源了
  11. Hypothesis Testing
  12. [bzoj5301][Cqoi2018]异或序列
  13. Hadoop学习笔记一:单节点安装
  14. yuzu 使用指南:如何在 PC 上运行 Switch 游戏
  15. xp系统无法从补丁服务器获取补丁,怎么获取到xp系统的微软补丁_微软补丁获取方法 - 驱动管家...
  16. 【非同局域网】vue调取本地后台服务解决方法
  17. 2021全球与中国光纤熔接机市场现状及未来发展趋势
  18. 常用字符串库函数总结
  19. python pandas合并单元格_python pandas拆分单元格
  20. iOS 地图导航路线规划详解

热门文章

  1. PB编程常用API函数
  2. 苏州企业如何识别不良商标代理机构
  3. 《人机交互技术》 第八章 移动界面设计
  4. BZOJ2791 Rendezvous
  5. 我的第一本书,被选作大学教材了!
  6. 小葵花妈妈课堂开课了:《ArrayList源码浅析》
  7. TPO Official 01 Speaking
  8. 你们这些90后,都是什么神仙小精灵?
  9. Android源码目录结构详解
  10. android手机闹钟程序,Android手机闹钟用法实例