本章节继续介绍: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. 牛客多校第二场B discount 基环内向树

    题意: 有n种商品,每种商品有一个价格 p[i] . 每种商品都有2种打折方式: 1. 给你优惠 d[i] 元. 2. 免费送你第 f[i] 种饮料. 现在求每种饮料至少一瓶的最小花费. dp[i][ ...

  2. 树形动态规划 fjutoj-2131 第四集,聚集城市

    第四集,聚集城市 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld   Problem Description 在小A ...

  3. CF - 652F Ants on a Circle

    题目传送门 题解: 先观察蚂蚁相撞, 可以发现, 如果我们将相撞的2个蚂蚁互换位置的话,蚂蚁相当于没有碰撞体积,直接穿过去了.所以我们可以直接计算出最终哪些位置上会有蚂蚁. 接下来就需要知道蚂蚁们的最 ...

  4. C++中的Inline函数的使用

    转载自:https://www.cnblogs.com/KellyHuang/p/4001470.html 在大多数机器上,函数调用does a lot of work:在调用函数前保存寄存器,调用结 ...

  5. Idea各种快捷生成Live Template的代码整合

    Idea各种快捷生成整合 快速生成method方法注释 配置方法 打开Idea ---> Settings , 搜索 live 点击右边的 + 号,创建模板组 Template Group,之后 ...

  6. 利用GPU训练网络时遇到的一些问题

    1. OSError: [Error 12] Cannot allocate memory 解决办法: 出现这个错误时我是绝望的...因为我看了别人的解决办法,要加内存条才能解决...但是我不甘心,想 ...

  7. 「每日五分钟,玩转JVM」:对象内存布局

    概览 一个对象根据不同情况可以被划分成两种情况,当对象是一个非数组对象的时候,对象头,实例数据,对齐填充在内存中三分天下,而数组对象中在对象头中多了一个用于描述数组对象长度的部分 对象头 对象头分为两 ...

  8. day01小结

    Java特点 1,面向对象的(write once,run anywhere) 2,跨平台的 ,,,,,, Java体系结构 JavaSE,JavaEE,JavaME,Java Card 对JDK,J ...

  9. JVM类加载器以及双亲委派模型

    从java开发人员的角度来看,类加载器可以分为3种: 1.启动类加载器(Bootstrap ClassLoader),负责将存放在<JAVA_HOME>\lib目录中,或者被-Xbootc ...

  10. “真”pandas“假”sql

    这篇博客利用了 pandas 对数据像 sql 一样去处理. 读取测试数据 import pandas as pd import numpy as np url = 'https://raw.gith ...