本章节继续介绍: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. The Suspects POJ1611

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 36417   Accepted: 17681 De ...

  2. Spreading the Wealth uva 11300

    A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...

  3. JOBDU 1140 八皇后

    题目1140:八皇后 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1064 解决:665 题目描述: 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个 ...

  4. 前后端分离,获取token,验证登陆是否失效

    maven依赖 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</a ...

  5. Springboot集成swagger2生成接口文档

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11509884.html    作者:jstarseven    码字挺辛苦的.....   一 ...

  6. JAVA父类的静态方法能否被子类重写?

    静态: 在编译时所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间,在实例化之前这个方法就已经存在于内存,跟类的对象没什么关系.子类中如果定义了相同名称的静态方法,并不会重写,而应 ...

  7. 二、springBoot 整合 mybatis 项目实战

    前言 上一篇文章开始了我们的springboot序篇,我们配置了mysql数据库,但是我们sql语句直接写在controller中并且使用的是jdbcTemplate.项目中肯定不会这样使用,上篇文章 ...

  8. Cookie的获取

    1.先创建Cookie对象,设置Cookie的键和值: Cookie cookie1="); Cookie cookie2="); Cookie cookie3="); ...

  9. 第二次实验报告:使用Packet Tracer分析应用层协议

    个人信息:      •  姓名:李微微       •  班级:计算1811       •  学号:201821121001 一.摘要 本文描述使用Packet Tracer,正确配置网络参数,抓 ...

  10. 理解setState

    近来在学习react源码, 最初是直接从入口一行一行的看, 结果跟着调用的函数跳转来跳去头都晕了. 后来决定带着一个目的去看源码, 每次看只研究一个东西. 一开始最想了解的就是充满魔性的setStat ...