Operators(操作符)(创建、转换操作符)
Operators(操作符):其实质是函数式编程中的高阶函数,是对响应式编程的各个过程拆分和封装后的产物,以便于我们操作数据流 。
在RxJava 2.x版本中,rxjava种类划分:
创建操作符:Observable.create(), Observable.just(), Observable.fromXXX(), Observable.defer();
转换操作符:Observable.map(), Observable.flatMap(), Observable.buffer(), Observable.concatMap();
过滤操作符:Observable.filter(), Observable.sample(), Observble.take();
组合操作符:Observable.join(), Observable.merge(), Observable.combineLatest();
条件运算符:Observable.amb(), Observable.contains(), Observable.skipUtil();
功能性操作符:Observable.subscribeOn(), Observable.observeOn(), Observable.delay();
错误处理操作符:Observable.onErrorResumeNext(), Observable.retry();
数学运算及聚合操作符:Observable.count(), Observable.reduce(), Observable.concat();
其他:Observable.toList(), Observable.publish().
代码实现:
<创建操作符>
@Test
public void testOperatorCreates() {
Observable.create(Emitter ->{
Emitter.onNext(123);
}).subscribe(value -> System.out.println("<create> emitter value is: " + value));
System.out.println();
Observable.just(1,2,3,4,5)
.subscribe(value -> System.out.println("<just> emitter value is: " + value));
Observable.just("First message, Hello RxJava","This is the second message")
.subscribe(value -> System.out.println("<just> emitter value is: " + value));
System.out.println();
Observable.fromCallable(() ->{
return Observable.just(10,20,30,40,50);
})
.subscribe(emitter -> System.out.println("<fromCallable> emitter value is: " + emitter));
System.out.println();
Observable.defer(() ->{
return Observable.just(11,12,13,14,15);
}).subscribe(emitter -> System.out.println("<defer> emitter value is: " + emitter));
System.out.println();
Integer[] array = {21,22,23,24,25};
Observable.fromArray(array).subscribe(emitter -> System.out.println("<fromArray> emitter value is: " + emitter));
}
执行结果:
<create> emitter value is: 123
<just> emitter value is: 1
<just> emitter value is: 2
<just> emitter value is: 3
<just> emitter value is: 4
<just> emitter value is: 5
<just> emitter value is: First message, Hello RxJava
<just> emitter value is: This is the second message
<fromCallable> emitter value is: io.reactivex.internal.operators.observable.ObservableFromArray@233c0b17
<defer> emitter value is: 11
<defer> emitter value is: 12
<defer> emitter value is: 13
<defer> emitter value is: 14
<defer> emitter value is: 15
<fromArray> emitter value is: 1
<fromArray> emitter value is: 2
<fromArray> emitter value is: 3
<fromArray> emitter value is: 4
<fromArray> emitter value is: 5
<转换操作符>
@Test
public void testOperatorChange() {
System.out.println("计算圆的面积:");
Observable.range(0, 10)
.map(value -> {
//针对输出格式的说明:如果形式是#.##,则保留两位小数,但是如果小数位低位是0则会不显示,即3.10会显示成3.1
//如果形式是#0.00,则同样保留两位小数,但是小数位低位上的0仍然保留,即完整的显示3.10
DecimalFormat format = new DecimalFormat("#0.00");
String square = format.format(Math.PI *(value * value));
return "半径为 " + value + " 的圆面积是: " + square;
}).subscribe(s -> System.out.println(s));
System.out.println();
Observable.just(8,9,10,11)
.flatMap(value ->{
//.concatMap(value ->{
List<String> list = new ArrayList<>();
for(int i =0;i<3;i++) {
list.add("this value is " + value);
}
Thread.sleep(100);
return Observable.fromIterable(list);
}).subscribe(s -> System.out.println(s));
System.out.println();
Observable.range(0, 20)
//.buffer(3).subscribe(s -> System.out.println(s));
.buffer(3,2).subscribe(s -> System.out.println(s));
}
执行结果:
计算圆的面积:
半径为 0 的圆面积是: 0.00
半径为 1 的圆面积是: 3.14
半径为 2 的圆面积是: 12.57
半径为 3 的圆面积是: 28.27
半径为 4 的圆面积是: 50.27
半径为 5 的圆面积是: 78.54
半径为 6 的圆面积是: 113.10
半径为 7 的圆面积是: 153.94
半径为 8 的圆面积是: 201.06
半径为 9 的圆面积是: 254.47
this value is 8
this value is 8
this value is 8
this value is 9
this value is 9
this value is 9
this value is 10
this value is 10
this value is 10
this value is 11
this value is 11
this value is 11
[0, 1, 2]
[2, 3, 4]
[4, 5, 6]
[6, 7, 8]
[8, 9, 10]
[10, 11, 12]
[12, 13, 14]
[14, 15, 16]
[16, 17, 18]
[18, 19]
代码说明:
concatMap和flatMap的作用几乎一模一样, 只是它的结果是严格按照上游发送的顺序来发送,
buffer拥有非常多的重载方法,这里只拿其中的两个来说明:
bufer(int count):
该操作符方法会将上游发送的数据切分成多个组,每个组的数量是count个,最后一组有多少就存多少,不足count个时,不会用其他数值进行补充,由此判断每个组切分后的数据没有重复;
bufer(int count,int offset):
源码中第二个参数定义的是skip,此处按个人理解,感觉使用offset更好解释.该操作符方法将上游的数据进行切分成多个组,每个组的数量也是count个,最后一组有多少就存多少,
不足count个时,不会用其他数值进行补充,从第二组开始,数值是前一组对应下标上的数值偏移offset之后的值。该方法要求count是大于0的整数,所以当count小于0,无效操作。
Operators(操作符)(创建、转换操作符)相关推荐
- RxJava3.0 操作符之转换操作符使用
RxJava3.0 操作符之转换操作符使用 转换操作符可用于对Observable发射的数据进行变换,最终观察者接收的是转换后我们需要的数据类型.本文主要介绍一些常用转换操作符的基本使用. 转换操 ...
- C++ 重载操作符与转换
<C++ Primer 4th>读书笔记 重载操作符是具有特殊名称的函数:保留字 operator 后接需定义的操作符号. Sales_item operator+(const Sales ...
- 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )
文章目录 I . const_cast 转换操作符 II . static_cast 转换操作符 III . dynamic_cast 转换操作符 IV . reinterpret_cast 转换操作 ...
- c++ primer读书笔记-第十四章 重载操作符与转换
C++ 允许我们重定义操作符用于类类型对象时的含义.如果需要,可以像内置转换那样使用类类型转换,将一个类型的对象隐式转换到另一类型. 例如标准库为容器类定义了几个重载操作符.这些容器类定义了下标操作符 ...
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 隐式类型转换与转换操作符operator T
隐式类型转换与转换操作符 operator T C++ 标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象 ( 创建临时对象 ) .如果这种转换代价很大 ( 调用类的构 ...
- RxJava2 转换操作符之FlatMap()方法
前言: 本篇基于Map操作符,阅读该篇请确保,你已经了解过它:RxJava2 转换操作符之Map()方法.一如既往,干大事的人都是直接先上图,再解释的.(建议用PC端阅读,图片可以放大.排版,也有利于 ...
- RxJava进阶一(创建类操作符)
RxJava进阶一(创建类操作符) RxJava进阶二(转换类操作符) RxJava进阶三(过滤类操作符) RxJava进阶四(组合类操作符) 前面已经对RxJava原理进行介绍,相信大家对于RXJa ...
- 《C++ Primer》之重载操作符与转换(中)
赋值操作符 类赋值操作符接受类类型形参,通常,该形参是对类类型的 const 引用,但也可以是类类型或对类类型的非 const 引用.如果没有定义这个操作符,则编译器将合成它.类赋值操作符必须是类的成 ...
- R语言dataframe创建新的特征(变量)、行加和特征、行均值特征(基于加减乘除、指数、模数等操作符)、创建新的特征(变量)、生成编码特征(基于比较操作符、逻辑操作符)
R语言dataframe创建新的特征(变量).行加和特征.行均值特征(基于加减乘除.指数.模数等操作符).为dataframe创建新的特征(变量).生成编码特征(基于比较操作符.逻辑操作符) 目录
最新文章
- UML-2-迭代、进化和敏捷
- 点云网络的论文理解(三)-点云网络的优化 PointNet++的总体说明
- latex使用小记录
- 自学it18大数据笔记-第三阶段Scala-day06——会持续更新……
- [BZOJ1007](HNOI2008)水平可见直线(半平面交习题)
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
- leetcode 454. 四数相加 II(哈希表)
- Python 包管理之 poetry
- ajax 获取openid,纯前端获取当前用户的openid(微信小程序)
- Java并发编程:synchronized
- 在cdh5.1.3中在mapreduce使用hbase
- LTE 调制与解调——QPSK,16QAM,64QAM误码率比较
- [软件发布]2007考研倒计时软件(完整版+绿色版)
- Python Pyecharts模块Map绘制中国地图自定义省份名称
- 计算机无法检测到键盘,电脑检测不到键盘怎么办
- cephadm全功能安装Ceph Pacfic
- 数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】
- 电商产品设计:商品推荐系统
- STM32F103学习记录——通过额外添加串口接口来接入ZigBee/蓝牙模块实现数据的远程传输
- My97 日期改变事件
热门文章
- (附源码)springboot助农电商系统 毕业设计 081919
- Python学习笔记(十五):python 中的面向对象
- 用html做祝福语朋友,对朋友的励志祝福语大全
- [python]---药品数据分析及预测(包括数据集,源码,报告)
- jQuery常用功能大全
- Orcad Schematic常用功能
- 阿里天池--宫颈癌检测(基于fastRCNN)新手初次尝试
- 数据结构例程——串的模式匹配(Brute-Force算法)
- 2022.06青少年软件编程(Python)等级考试试卷(四级)
- 软件测试员最核心的竞争力究竟是什么