网站首页 > java教程 正文
操作符
本节介绍RxJava其他比较常用的操作符:take操作符和window操作符。
take操作符
take操作符用于根据索引在源流上进行元素的挑选操作,挑选源流上的n个元素。如果源流序列中的项少于指定索引,就抛出错误。
take操作符的处理流程如图4-11所示。
下面是一个使用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所示。
一个使用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所示。
使用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响应式编程框架,其他操作符
- 下篇文章给大家讲解的是SpringCloudRPC远程调用核心原理: RxJava响应式编程框架,RxJava的Scheduler调度器;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!
猜你喜欢
- 2024-12-03 Java,JDK11,发布订阅模式,响应式流(Reactive Streams)及背压
- 2024-12-03 有空就来学Hystrix RPC保护的原理,RPC监控之滑动窗口的实现原理
- 2024-12-03 开发Spring Boot应用并部署到Minikube
- 2024-12-03 SpringWeb服务应用响应式Web开发组件:响应式编程和SpringBoot
- 2024-12-03 Reactor响应式编程 第二篇 Spring Boot 整合 Reactor 简单例子
- 2024-12-03 反应式编程之Spring Web-Flux/Project Reactor
- 2024-12-03 即学即用Kotlin - 协程
- 2024-12-03 并发编程:CompletableFuture异步编程详解
- 2024-12-03 终于有人把安卓程序员必学知识点全整理出来了,有如醍醐灌顶
- 2024-12-03 Kotlin Flow的设计精髓:响应式编程在Android中的实践
你 发表评论:
欢迎- 最近发表
-
- JAVA面试|为什么Spring Boot的jar可以直接运行?
- 什么情况,今年面试都不问八股文了??准备了几个月,结果一个都不问。。
- LangChain系列之如何使用LangChain4j构建RAG应用(1)
- JAVA入门教程-第2章 基本编程概念
- FTPC Pnuts语言(ftp mput put)
- 这9个工具库让我的Java开发效率提升了80%
- VS2022配置x86/x64调用32位和64位汇编语言动态库环境
- 别再裸写 parseFrom() 了!这才是 MQTT + Protobuf 消费的正确姿势
- aardio + Java + JavaScript 混合开发快速入门
- 铁打的程序,流水的语言,2018年JAVA编程还想坚挺500年?
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)