SpringCloudRPC调用核心原理:RxJava响应式编程框架,其他操作符

1496 篇文章 10 订阅
1494 篇文章 14 订阅

操作符

本节介绍RxJava其他比较常用的操作符:take操作符和window操作符。

 take操作符

take操作符用于根据索引在源流上进行元素的挑选操作,挑选源流上的n个元素。如果源流序列中的项少于指定索引,就抛出错误。

take操作符的处理流程如图4-11所示。

SpringCloudRPC调用核心原理:RxJava响应式编程框架,其他操作符

图4-11 take操作符的处理流程

下面是一个使用take操作符完成10秒倒计时的演示实例,代码如下:

package com.crazymaker.demo.rxJava.basic;
...
@Slf4j
public class OtherOperatorDemo
{
 ...
 /**
 *演示take操作符
 *这是一个10秒倒计时实例
 */
 @Test
 public void takeDemo() throws InterruptedException
 {
 Observable.interval(1, TimeUnit.SECONDS) //设置执行间隔
 .take(10) //10秒倒计时
 .map(aLong -> 10 - aLong)
 .subscribe(aLong -> log.info(aLong.toString()));
 Thread.sleep(Integer.MAX_VALUE);
 }}

运行这个演示程序,输出的结果如下:

[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 10
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 9
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 8
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 7
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 6
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 5
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 4
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 3
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 2
[RxComputationScheduler-1] INFO c.c.d.r.b.OtherOperatorDemo - 1

skip操作符与take操作符类似,也是用于根据索引在源流上进行元素的挑选操作,只是take是取前n个元素,而skip是跳过前n个元素。注意,如果序列中的项少于指定索引,那么两个函数都抛出错误。

 window操作符

RxJava的窗口可以理解为固定数量(或者固定时间间隔)的元素分组。假定通过window操作符以固定数量n进行窗口划分,一旦流上弹射的元素的数量足够一个窗口的数量n,那么输出流上将弹出一个新的元素,输出元素是一个Observable主题对象,该主题包含源流窗口之内的n个元素。

使用window操作符创建固定数量窗口(滚动窗口)的处理流程如图4-12所示。

SpringCloudRPC调用核心原理:RxJava响应式编程框架,其他操作符

图4-12 使用window操作符创建固定数量窗口(滚动窗口)

一个使用window操作符以固定数量进行元素分组的示例程序如下:

package com.crazymaker.demo.rxJava.basic;
//省略import
@Slf4jpublic class WindowDemo
{
 /**
 *演示window创建操作符创建滚动窗口
 */
 @Test
 public void simpleWindowObserverDemo()
 {
 List<Integer> srcList = Arrays.asList(10, 11, 20, 21, 30, 31);
 Observable.from(srcList)
 .window(3) //以固定数量分组
 .flatMap(o -> o.toList())
 .subscribe(list -> log.info(list.toString()));
}
...
}

运行这个演示程序,输出的结果如下:

[main] INFO c.c.d.rxJava.basic.WindowDemo - [10, 11, 20]
[main] INFO c.c.d.rxJava.basic.WindowDemo - [21, 30, 31]

在使用window进行分组时,不同窗口的元素还可以重叠,可以理解成滑动窗口。

创建重叠窗口使用函数window(int count,int skip),其中第一个参数为窗口的元素个数,第二个参数为下一个窗口跳过的元素个数。使用window操作符创建重叠窗口的处理流程如图4-13所示。

SpringCloudRPC调用核心原理:RxJava响应式编程框架,其他操作符

图4-13 使用window操作符创建重叠窗口(滑动窗口)

使用window操作符以固定数量创建重叠窗口的示例程序如下:

package com.crazymaker.demo.rxJava.basic;
//省略import
@Slf4j
public class WindowDemo
{
 ...
 /**
 *演示window创建操作符创建滑动窗口
 */
 @Test
 public void windowObserverDemo()
 {
 List<Integer> srcList = Arrays.asList(10, 11, 20, 21, 30, 31);
 Observable.from(srcList)
 .window(3, 1)
 .flatMap(o -> o.toList())
 .subscribe(list -> log.info(list.toString()));
 }
 ...
 }

运行这个演示程序,输出的结果如下:

[main] INFO c.c.d.rxJava.basic.WindowDemo - [10, 11, 20]
[main] INFO c.c.d.rxJava.basic.WindowDemo - [11, 20, 21]
[main] INFO c.c.d.rxJava.basic.WindowDemo - [20, 21, 30]
[main] INFO c.c.d.rxJava.basic.WindowDemo - [21, 30, 31]
[main] INFO c.c.d.rxJava.basic.WindowDemo - [30, 31]
[main] INFO c.c.d.rxJava.basic.WindowDemo - [31]

RxJava的窗口还可以按照固定时间间隔进行分组。一个使用window操作符以固定时间间隔创建不重叠窗口(滚动窗口)的示例程序如下:

package com.crazymaker.demo.rxJava.basic;
//省略import
@Slf4j
public class WindowDemo
{
 ...
 /**
 *演示window创建操作符创建时间窗口
 */
 @Test
 public void timeWindowObserverDemo() throws InterruptedException
 {
 Observable eventStream = Observable
 .interval(100, TimeUnit.MILLISECONDS);
 eventStream.window(300, TimeUnit.MILLISECONDS)
 .flatMap(o -> ((Observable<Integer>) o).toList())
 .subscribe(list -> log.info(list.toString()));
 Thread.sleep(Integer.MAX_VALUE);
 }
 ...
}

在此示例中,window操作符以300ms(毫秒)的固定间隔划分出非重叠窗口,每个窗口保持300毫秒的时间,从而确保输入流eventStream接收到3个值,直到停止。

运行这个演示程序,输出的结果如下:

[RxComputationScheduler-1] INFO c.c.d.rxJava.basic.WindowDemo - [0, 1]
[RxComputationScheduler-1] INFO c.c.d.rxJava.basic.WindowDemo - [2, 3, 4]
[RxComputationScheduler-1] INFO c.c.d.rxJava.basic.WindowDemo - [5, 6, 7]
[RxComputationScheduler-1] INFO c.c.d.rxJava.basic.WindowDemo - [8, 9, 10]

本文给大家讲解的内容是SpringCloudRPC远程调用核心原理: RxJava响应式编程框架,其他操作符

  1. 下篇文章给大家讲解的是SpringCloudRPC远程调用核心原理: RxJava响应式编程框架,RxJava的Scheduler调度器;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值