实战SpringCloud响应式微服务系列教程(第七章)
本章节继续介绍:Flux和Mono操作符(二)
1.条件操作符
Reactor中常用的条件操作符有defaultIfRmpty、skipUntil、skipWhile、takeUntil和takeWhile等。
1、defaultIfRmpty
defaultIfRmpty操作符返回来自原始数据流的元素,如果原始数据流中没有元素,则返回一个默认元素。
defaultIfRmpty操作符在实际开发过程中应用广泛,通常用在对方法返回值的处理上。如下controller层对service层返回值的处理。
@GetMapper("/article/{id}")
public Mono<ResponseEntity<Article>> findById(@PathVariable String id){
return articleService.findOne(id)
.map(ResponseEntity::ok)
.defaultIfRmpty(ResponseEntity.status(404).body(null));
}
2、takeUntil
takeUntil操作符的基本用法是takeUntil(Predicate<? super T>> predicate),其中Predicate代表一种断言条件,takeUntil将提取元素直到断言条件返回true。
示例代码如下:
Flux.range(1,100).takeUntil(i -> i == 10).subscribe(System.out::println);
3、takeWhile
takeWhile操作符的基本用法是takeWhile(Predicate<? super T>> continuePredicate),其中continuePredicate也代表一种断言条件。与takeUntil不同的是,takeWhile会在continuePredicate条件返回true时才进行元素的提取。
示例代码如下:
Flux.range(1,100).takeWhile(i -> i <= 10).subscribe(System.out::println);
4、skipUntil
与takeUntil相对应,skipUntil的基本用法是skipUntil(Predicate<? super T>> predicate)。skipUntil将丢弃原始数据中的元素,直到Predicate返回true。
5、skipWhile
与takeWhile相对应,skipWhile操作符的基本用法是skipWhile(Predicate<? super T>> continuePredicate)。当continuePredicate返回true时才进行元素的丢弃。
2.数学操作符
Reactor中常用的数学操作符有concat、count、reduce等。
1、concat
concat用来合并来自不同Flux的数据,这种合并采用的是顺序的方式。
2、count
count操作符比较简单,用来统计Flux中元素的个数。
3、reduce
reduce操作符对流中包含的所有元素进行累积操作,得到一个包含计算结果的Mono序列。具体的累计操作也是通过一个BiFunction来实现的。
示例代码如下:
Flux.range(1,10).reduce((x,y) -> x+y).subscribe(System.out::println);
这里BiFunction就是一个求和函数,用来对1到10的数字进行求和,运行结果为55。
与其类似的还有一个reduceWith。
示例代码如下:
Flux.range(1,10).reduceWith(() - >5,(x,y) -> x+y).subscribe(System.out::println);
这里使用5来初始化求和过程,得到的结果是60。
3.Observable工具操作符
Reactor中常用的Observable操作符有delay、subscribe、timeout等。
1、delay
delay将时间的传递向后延迟一段时间。
2、subscribe
在前面的代码演示了subscribe操作符的用法,我们可以通过subscribe()方法来添加相应的订阅逻辑。
在前面章节中我们提到了Reactor中的消息类型有三种,即正常消息,异常消息和完成消息。subscribe操作符可以只处理其中包含的正常消息,也可以同时处理异常消息和完成消息。当我们用subscribe处理异常消息时可以采用以下方式。
Mono.just(100)
.conacatWith(Mono.error(new IllegalStateException()))
.subscribe(System.out::println,System.err::println);
以上代码执行结果如下,我们得到了一个100,同时也获取了IllegalStateExxeption这个异常。
100
java.lang.IllegalStateExxeption
有时候我们不想直接抛出异常,而是想采用一个容错策略来返回一个默认值,就可以采用以下方式。
Mono.just(100)
.conacatWith(Mono.error(new IllegalStateException()))
.onErrorReturn(0)
.subscribe(System.out::println);
以上代码执行结果如下。当产生异常时,使用onErrorReturn()方法返回一个默认值0.
100
0
另外容错策略也是通过switchOnError()方法使用另外的流产生元素。以下代码示例演示了这种策略。
与上面的执行结果相同。
Mono.just(100)
.conacatWith(Mono.error(new IllegalStateException()))
.switchOnError(Mono.just(0))
.subscribe(System.out::println);
3、timeout
timeout操作符维持原始被观察者的状态,在特定时间内没有产生任何事件时,将生成一个异常。
4、block
block操作符在没有接收到下一个元素之前一直被阻塞。block操作符通常用来把响应式的数据流转换成传统的数据流。
例如,使用如下方法时,我们分别将Flux数据流和Mono数据流转变成了普通的List<Order>对象和单个Order对象,同样也可以设置block的等待时间。
public List<Order> getAllOrder(){
return orderService.getAllOrders().block(Duration.ofSecond(5));
}
public Order getOrderById(Long orderId){
return orderService.getOrderById(orderId).block(Duration.ofSecond(2));
}
往期
实战SpringCloud响应式微服务系列教程(第五章)
实战SpringCloud响应式微服务系列教程(第七章)的更多相关文章
- 实战SpringCloud响应式微服务系列教程(第二章)
接上一篇:实战SpringCloud响应式微服务系列教程(第一章) 1.1.2背压 背压是响应式编程的核心概念,这一节也是我们了解响应式编程的重点. 1.背压的机制 在生产者/消费者模型中,我们意识到 ...
- 实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务
本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 从本节开始我们 ...
- 实战SpringCloud响应式微服务系列教程(第一章)
前言 在当今互联网飞速发展的时代,业务需求不断的更新和产品的迭代给系统开发过程和编程模式也带来巨大挑战,Spring Cloud微服务也随之应用而生,从springboot1.x到springboot ...
- 实战SpringCloud响应式微服务系列教程(第三章)
接着之前的: 实战SpringCloud响应式微服务系列教程(第一章) 实战SpringCloud响应式微服务系列教程(第二章) 1.1.3Reactor框架 响应式编程是一种编程模型,本节将介绍这种 ...
- 实战SpringCloud响应式微服务系列教程(第四章)
接上一篇: 实战SpringCloud响应式微服务系列教程(第一章) 实战SpringCloud响应式微服务系列教程(第二章) 实战SpringCloud响应式微服务系列教程(第三章) 1.1.4 引 ...
- 实战SpringCloud响应式微服务系列教程(第六章)
本章节介绍:Flux和Mono操作符 和其他主流的响应式编程一样,Reactor框架的设计目标也是为了简化相应式流的使用方法.为此Reactor框架提供了大量操作符用于操作Flux和Mono对象. 本 ...
- 实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务
本文为实战SpringCloud响应式微服务系列教程第八章,讲解构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 1.使用springboot2.1.4构建RE ...
- 实战SpringCloud响应式微服务系列教程(第十章)响应式RESTful服务完整代码示例
本文为实战SpringCloud响应式微服务系列教程第十章,本章给出响应式RESTful服务完整代码示例.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 1.搭建响应式RESTful服务. ...
- Cobalt Strike系列教程第七章:提权与横向移动
Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...
随机推荐
- lightoj 1028 - Trailing Zeroes (I)(素数筛)
We know what a base of a number is and what the properties are. For example, we use decimal number s ...
- codeforces 454 E. Little Pony and Summer Sun Celebration(构造+思维)
题目链接:http://codeforces.com/contest/454/problem/E 题意:给出n个点和m条边,要求每一个点要走指定的奇数次或者是偶数次. 构造出一种走法. 题解:可能一开 ...
- 利用GPU训练网络时遇到的一些问题
1. OSError: [Error 12] Cannot allocate memory 解决办法: 出现这个错误时我是绝望的...因为我看了别人的解决办法,要加内存条才能解决...但是我不甘心,想 ...
- 降维和PCA
简介 要理解什么是降维,书上给出了一个很好但是有点抽象的例子. 说,看电视的时候屏幕上有成百上千万的像素点,那么其实每个画面都是一个上千万维度的数据:但是我们在观看的时候大脑自动把电视里面的场景放在我 ...
- 【Offer】[38] 【字符串的排列】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个字符串,打印出该字符串中字符的所有排列.例如,输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb. ...
- ssh-agent代理的简单用法
前言 在ansible的官方文档中,提到了强烈推荐用ssh-agent来管理密钥 究竟ssh-agent是什么,它有什么用法呢,下面来一探究竟. ssh-agent是什么?用处是什么? ssh-age ...
- Unity3D_02_基类MonoBehaviour/自带函数以及脚本执行的生命周期
导引: 其中Time,Input,Physics都是Unity中的全局变量.GameObject是游戏中的基本物件.GameObject是由Component组合而成的,GameObject本身必须有 ...
- 去掉Myeclipse对JS等文件的验证
在用Myeclipse导入新工程或在写代码时,最郁闷的就是它对js,jsp,html的验证太严格了,有时会呈现一个红叉或者一个黄色的感慨号,一运行就报Cannot return from outsid ...
- Kali Linux 安装open-vm-tools
Kali Linux是基于Debian的Linux发行版,集成了精心挑选的渗透测试和安全审计的工具,供渗透测试和安全设计人员使用.(以及一些各种颜色的hacker ^-^) 首先需要安装好虚拟机(V ...
- StringBulider类
StringBulider类创建的字符串同样可以对字符串进行修改: public class StringBuliderDemo { public static void main(String[] ...