• 实战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响应式微服务系列教程(第四章)

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

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

  • 相关阅读:
    Linux sed命令实例详解
    hadoop2.0 和1.0的区别
    linux如何修改主机名
    hadoop主节点(NameNode)备份策略以及恢复方法
    Hadoop 添加删除数据节点(datanode)
    Hadoop常见错误及处理方法
    【转】ImageView.ScaleType属性
    MonoBehaviour.print和Debug.Log是同样的作用
    unity自带寻路Navmesh入门教程
    前向渲染路径细节 Forward Rendering Path Details
  • 原文地址:https://www.cnblogs.com/javazhiyin/p/11660204.html
Copyright © 2020-2023  润新知