Android RxJava操作符详解系列: 变换操作符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android RxJava操作符详解系列: 变换操作符相关的知识,希望对你有一定的参考价值。

Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 android开发者的欢迎。
Github截图

如果还不了解 RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程

RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求
今天,我将为大家详细介绍RxJava操作符中最常用的变换操作符,并附带 Retrofit 结合 RxJava的实例Demo教学,希望你们会喜欢。
本系列文章主要基于 Rxjava 2.0
接下来的时间,我将持续推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!

示意图
目录

示意图

1. 作用

对事件序列中的事件 / 整个事件序列 进行加工处理(即变换),使得其转变成不同的事件 / 整个事件序列
具体原理如下
示意图

2. 类型

RxJava中常见的变换操作符如下:
示意图

下面,我将对每种操作符进行详细介绍

注:本文只讲解RxJava2在开发过程中常用的变换操作符
3. 应用场景 & 对应操作符 介绍

下面,我将对 RxJava2 中的变换操作符进行逐个讲解
注:在使用RxJava 2操作符前,记得在项目的Gradle中添加依赖:
dependencies {
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1‘
compile ‘io.reactivex.rxjava2:rxjava:2.0.7‘
// 注:RxJava2 与 RxJava1 不能共存,即依赖不能同时存在
}
1
2
3
4
5
3.1 Map()

作用
对 被观察者发送的每1个事件都通过 指定的函数 处理,从而变换成另外一种事件

即, 将被观察者发送的事件转换为任意的类型事件。
原理

示意图

应用场景
数据类型转换

具体使用
下面以将 使用Map() 将事件的参数从 整型 变换成 字符串类型 为例子说明

示意图

// 采用RxJava基于事件流的链式操作
Observable.create(new ObservableOnSubscribe<Integer>() {

// 1. 被观察者发送事件 = 参数为整型 = 1、2、3
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);

}
// 2. 使用Map变换操作符中的Function函数对被观察者发送的事件进行统一变换:整型变换成字符串类型
}).map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return "使用 Map变换操作符 将事件" + integer +"的参数从 整型"+integer + " 变换成 字符串类型" + integer ;
}
}).subscribe(new Consumer<String>() {

// 3. 观察者接收事件时,是接收到变换后的事件 = 字符串类型
@Override
public void accept(String s) throws Exception {
Log.d(TAG, s);
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
测试结果
示意图

从上面可以看出,map() 将参数中的 Integer 类型对象转换成一个 String类型 对象后返回

同时,事件的参数类型也由 Integer 类型变成了 String 类型
3.2 FlatMap()

作用:将被观察者发送的事件序列进行 拆分 & 单独转换,再合并成一个新的事件序列,最后再进行发送

原理

为事件序列中每个事件都创建一个 Observable 对象;
将对每个 原始事件 转换后的 新事件 都放入到对应 Observable对象;
将新建的每个Observable 都合并到一个 新建的、总的Observable 对象;
新建的、总的Observable 对象 将 新合并的事件序列 发送给观察者(Observer)
示意图

应用场景
无序的将被观察者发送的整个事件序列进行变换

具体使用

// 采用RxJava基于事件流的链式操作
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}

// 采用flatMap()变换操作符
}).flatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
final List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("我是事件 " + integer + "拆分后的子事件" + i);
// 通过flatMap中将被观察者生产的事件序列先进行拆分,再将每个事件转换为一个新的发送三个String事件
// 最终合并,再发送给被观察者
}
return Observable.fromIterable(list);
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.d(TAG, s);
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
测试结果
示意图
注:新合并生成的事件序列顺序是无序的,即 与旧序列发送事件的顺序无关
3.3 ConcatMap()

作用:类似FlatMap()操作符
与FlatMap()的 区别在于:拆分 & 重新合并生成的事件序列 的顺序 = 被观察者旧序列生产的顺序

原理

示意图

应用场景
有序的将被观察者发送的整个事件序列进行变换

具体使用

// 采用RxJava基于事件流的链式操作
Observable.create(new ObservableOnSubscribe<Integer>(www.078881.cn/) {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1feifanshifan8.cn/);
emitter.onNext(2);
emitter.onNext(3);
}

// 采用concatMap()变换操作符
}).concatMap(new Function<Integer, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(Integer integer) throws Exception {
final List<String> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list.add("我是事件 " + integer + "拆分后的子事件" + i);
// 通过concatMap中将被观察者生产的事件序列先进行拆分,再将每个事件转换为一个新的发送三个String事件
// 最终合并,再发送给被观察者
}
return Observable.fromIterable(list);
}
}).subscribe(new Consumer<String>(www.jcx127.cn) {
@Override
public void accept(String www.tianhengyl1.com s) throws Exception {
Log.d(TAG, s);
}

测试结果
示意图
注:新合并生成的事件序列顺序是有序的,即 严格按照旧序列发送事件的顺序
3.4 Buffer()

作用
定期从 被观察者(Obervable)需要发送的事件中 获取一定数量的事件 & 放到缓存区中,最终发送


































































































































































以上是关于Android RxJava操作符详解系列: 变换操作符的主要内容,如果未能解决你的问题,请参考以下文章

Rxjava2 Observable的布尔操作符详解及实例

rxjava-几类变换2

RxJava操作符系列一(上)

Rxjava2 Observable的创建详解及实例

Android函数响应式编程最新RxJava-操作符入门

Android RxJava 实战系列:联合判断