300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android RxJava操作符的学习---变换操作符

Android RxJava操作符的学习---变换操作符

时间:2023-04-13 01:36:35

相关推荐

Android RxJava操作符的学习---变换操作符

3.2 变换操作符

3.2.1.作用

对事件序列中的事件 / 整个事件序列 进行加工处理(即变换),使得其转变成不同的事件 / 整个事件序列

具体原理

3.2.2.作用类型

应用场景

嵌套回调(Callback hell

根据上述应用场景,常见的变换操作符类型包括:

3.2.3. 应用场景 & 对应操作符 介绍

下面,我将对RxJava2中的变换操作符进行逐个讲解注:在使用RxJava 2操作符前,记得在项目的Gradle中添加依赖:

dependencies {compile 'io.reactivex.rxjava2:rxandroid:2.0.1'compile 'io.reactivex.rxjava2:rxjava:2.0.7'// 注:RxJava2 与 RxJava1 不能共存,即依赖不能同时存在}

Map()

作用

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

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

原理应用场景

数据类型转换具体使用

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

// 采用RxJava基于事件流的链式操作Observable.create(new ObservableOnSubscribe<Integer>() {// 1. 被观察者发送事件 = 参数为整型 = 1、2、3@Overridepublic void subscribe(ObservableEmitter<Integer> emitter) throws Exception {emitter.onNext(1);emitter.onNext(2);emitter.onNext(3);}// 2. 使用Map变换操作符中的Function函数对被观察者发送的事件进行统一变换:整型变换成字符串类型}).map(new Function<Integer, String>() {@Overridepublic String apply(Integer integer) throws Exception {return "使用 Map变换操作符 将事件" + integer +"的参数从 整型"+integer + " 变换成 字符串类型" + integer ;}}).subscribe(new Consumer<String>() {// 3. 观察者接收事件时,是接收到变换后的事件 = 字符串类型@Overridepublic void accept(String s) throws Exception {Log.d(TAG, s);}});

测试结果

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

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

FlatMap()

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

原理

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

应用场景

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

具体使用

// 采用RxJava基于事件流的链式操作Observable.create(new ObservableOnSubscribe<Integer>() {@Overridepublic void subscribe(ObservableEmitter<Integer> emitter) throws Exception {emitter.onNext(1);emitter.onNext(2);emitter.onNext(3);}// 采用flatMap()变换操作符}).flatMap(new Function<Integer, ObservableSource<String>>() {@Overridepublic 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>() {@Overridepublic void accept(String s) throws Exception {Log.d(TAG, s);}});

测试结果

注:新合并生成的事件序列顺序是无序的,即 与旧序列发送事件的顺序无关

ConcatMap()

作用:类似FlatMap()操作符

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

原理

应用场景

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

具体使用

// 采用RxJava基于事件流的链式操作Observable.create(new ObservableOnSubscribe<Integer>() {@Overridepublic void subscribe(ObservableEmitter<Integer> emitter) throws Exception {emitter.onNext(1);emitter.onNext(2);emitter.onNext(3);}// 采用concatMap()变换操作符}).concatMap(new Function<Integer, ObservableSource<String>>() {@Overridepublic 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>() {@Overridepublic void accept(String s) throws Exception {Log.d(TAG, s);}});

测试结果

注:新合并生成的事件序列顺序是有序的,即 严格按照旧序列发送事件的顺序

Buffer()

作用

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

原理

应用场景

缓存被观察者发送的事件具体使用

那么,Buffer()每次是获取多少个事件放到缓存区中的呢?下面我将通过一个例子来说明

// 被观察者 需要发送5个数字Observable.just(1, 2, 3, 4, 5).buffer(3, 1) // 设置缓存区大小 & 步长// 缓存区大小 = 每次从被观察者中获取的事件数量// 步长 = 每次获取新事件的数量.subscribe(new Observer<List<Integer>>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(List<Integer> stringList) {//Log.d(TAG, " 缓存区里的事件数量 = " + stringList.size());for (Integer value : stringList) {Log.d(TAG, " 事件 = " + value);}}@Overridepublic void onError(Throwable e) {Log.d(TAG, "对Error事件作出响应" );}@Overridepublic void onComplete() {Log.d(TAG, "对Complete事件作出响应");}});

测试结果过程解释

下面,我将通过一个图来解释Buffer()原理 & 整个例子的结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。