本章节继续介绍: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响应式微服务系列教程(第四章)

实战SpringCloud响应式微服务系列教程(第五章)

实战SpringCloud响应式微服务系列教程(第六章)

实战SpringCloud响应式微服务系列教程(第七章)的更多相关文章

  1. 实战SpringCloud响应式微服务系列教程(第二章)

    接上一篇:实战SpringCloud响应式微服务系列教程(第一章) 1.1.2背压 背压是响应式编程的核心概念,这一节也是我们了解响应式编程的重点. 1.背压的机制 在生产者/消费者模型中,我们意识到 ...

  2. 实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务

    本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 从本节开始我们 ...

  3. 实战SpringCloud响应式微服务系列教程(第一章)

    前言 在当今互联网飞速发展的时代,业务需求不断的更新和产品的迭代给系统开发过程和编程模式也带来巨大挑战,Spring Cloud微服务也随之应用而生,从springboot1.x到springboot ...

  4. 实战SpringCloud响应式微服务系列教程(第三章)

    接着之前的: 实战SpringCloud响应式微服务系列教程(第一章) 实战SpringCloud响应式微服务系列教程(第二章) 1.1.3Reactor框架 响应式编程是一种编程模型,本节将介绍这种 ...

  5. 实战SpringCloud响应式微服务系列教程(第四章)

    接上一篇: 实战SpringCloud响应式微服务系列教程(第一章) 实战SpringCloud响应式微服务系列教程(第二章) 实战SpringCloud响应式微服务系列教程(第三章) 1.1.4 引 ...

  6. 实战SpringCloud响应式微服务系列教程(第六章)

    本章节介绍:Flux和Mono操作符 和其他主流的响应式编程一样,Reactor框架的设计目标也是为了简化相应式流的使用方法.为此Reactor框架提供了大量操作符用于操作Flux和Mono对象. 本 ...

  7. 实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务

    本文为实战SpringCloud响应式微服务系列教程第八章,讲解构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 1.使用springboot2.1.4构建RE ...

  8. 实战SpringCloud响应式微服务系列教程(第十章)响应式RESTful服务完整代码示例

    本文为实战SpringCloud响应式微服务系列教程第十章,本章给出响应式RESTful服务完整代码示例.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 1.搭建响应式RESTful服务. ...

  9. Cobalt Strike系列教程第七章:提权与横向移动

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

随机推荐

  1. 大数乘法(适合k进制)

    #include<stdio.h> #include<string.h> #define N 10000 void inv(char str[],int n) { int i, ...

  2. 2017ACM总结

    首先对自己表示强烈的谴责, 这个时间应该是打cf的时间, 没有想到我又秀到了自己, 放弃了CF, 23333, 菜鸡wxk. 高中刚毕业的时候,听大学生们跪求老师不要给挂科,当时想的是,哇上了大学就不 ...

  3. yzoj1985 最长公共单调上升子序列 题解

    题面给两个序列a,b长度分别为n,m求最长公共上升子序列,百度了一下求公共子序列的问题好像叫做LCS,而上升的叫做LCIS.都是dp的例题. 先来说说最长公共子序列,这是一道比较经典的dp题,我们可以 ...

  4. 【转】Android CTS 测试

    http://blog.csdn.net/zxm317122667/article/details/8508013 Android-CTS 4.0.3测试基本配置 1. Download CTS CT ...

  5. 关于git使用的几点理解

    1.git为分布式的版本控制系统,有远程仓库和本地仓库,远程仓库和本地仓库之间建立关联关系后,可将本地仓库的更新push(相当于是内容同步)到远程仓库进行保存,远程仓库的作用相当于一个最终代码备份的地 ...

  6. EasyUI总结(一)-- 入门

    一.EasyUI下载 EasyUI官方下载地址:http://www.jeasyui.com/download/index.php,目前最新的版本是:jQuery EasyUI 1.4.1

  7. 爬取凤凰网站财经类的新闻,函数时编程,可全部实现,由于内容量大,需要时间太长,服务器会禁止,为了防止,可以将time.sleep()设置的时间长点

    import requests from selenium import webdriver import time def grasp(urlT): driver = webdriver.Chrom ...

  8. struts2表单提单细节处理

    1. 上传文件 大部分项目避免不了要上传文件. struts2提供了封闭的上传文件的入口, 网络上也存在大量的插件用于网页表单中上传文件. 由于自己习惯用SSH框架, 所以介绍一下struts2中文件 ...

  9. Https与Http的区别以及Https的解说

    http:信息不加密,具有信息被盗的危险 https:信息加密,第三获取原信息 1:https多了一层SSL,而这一层的设计是为了达到如下的 (1) 所有信息都是加密传播,第三方无法窃听. (2) 具 ...

  10. MOOC 数据库系统笔记(二):数据库系统的基本结构及其演变发展

    数据库系统的结构抽象与演变 数据库的标准结构 DBMS管理数据的三个层次 1.External Level = User Level 某一用户能够看到与处理的数据,全局数据中的某一部分 2.Conce ...