flux mono 转_自语之Reactor中FluxMono的粗略使用
最近,需要快速使用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的粗略使用相关推荐
- java reactor框架_Java反应式框架Reactor中的Mono和Flux
1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...
- flux java_Java反应式框架Reactor中的Mono和Flux
1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...
- reactor p java_Java反应式框架Reactor中的Mono和Flux
1. 前言 最近写关于响应式编程的东西有点多,很多同学反映对Flux和Mono这两个Reactor中的概念有点懵逼.但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebF ...
- Java反应式框架Reactor中的Mono和Flux,Java程序员必看
由于响应流的特点,我们不能再返回一个简单的POJO对象来表示结果了.必须返回一个类似Java中的Future的概念,在有结果可用时通知消费者进行消费响应. Reactive Stream规范中这种被定 ...
- Reactor中文文档
2019独角兽企业重金招聘Python工程师标准>>> Reactor 3 参考文档 Stephane Maldini @smaldini Simon Baslé @simonbas ...
- Reactor中的Thread和Scheduler
文章目录 简介 Thread多线程 Schedule定时器 Schedulers工具类 publishOn 和 subscribeOn publishOn subscribeOn 简介 今天我们要介绍 ...
- linux ubuntu安装 mono,在Ubuntu 18.04系统中安装Mono及基本使用Mono的方法
本文介绍在Ubuntu 18.04操作系统中安装Mono及基本使用Mono的方法.Mono是一个基于ECMA/ISO标准开发和运行跨平台应用程序的平台,它是Microsoft .NET框架的免费开源实 ...
- ios 图像翻转_在iOS 14中使用计算机视觉的图像差异
ios 图像翻转 Human eyes are very receptive to visual representations. Similarly, computer vision enables ...
- 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 ...
- ux的重要性_颜色在UX中的重要性
ux的重要性 When coming up with a new digital solution (desktop, mobile, app, whatever it may be) or any ...
最新文章
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)
- OpenAI探索机器人模拟训练新方法:仿真与真实世界无缝衔接
- syn flood dos
- 系统鸿蒙生态链,任正非透露鸿蒙系统细节,比安卓速度快60%,两三年建好生态链...
- openjudge 菲波那契数列 2753
- 安装fastdfs依赖包
- windows下curl
- 抖音api开放平台对接_抖音新增酒店预订等功能,一只脚踏进美团、携程腹地
- css 鼠标悬浮样式_【技术】CSS设置链接鼠标(失效)不能点样式
- 30名工程师,历时1300天打造,又一“国产”AI框架开源了
- Hypothesis Testing
- [bzoj5301][Cqoi2018]异或序列
- Hadoop学习笔记一:单节点安装
- yuzu 使用指南:如何在 PC 上运行 Switch 游戏
- xp系统无法从补丁服务器获取补丁,怎么获取到xp系统的微软补丁_微软补丁获取方法 - 驱动管家...
- 【非同局域网】vue调取本地后台服务解决方法
- 2021全球与中国光纤熔接机市场现状及未来发展趋势
- 常用字符串库函数总结
- python pandas合并单元格_python pandas拆分单元格
- iOS 地图导航路线规划详解