今天,对RxJava中的变换操作符进行学习。
一、变换操作符的作用
-
对事件序列中的事件/整个事件序列进行加工处理(
变换
),使其转变成不同的事件/整个事件序列
具体原理如下:
[图片上传失败...(image-d3d9ac-1512547008288)]
二、变换操作符的类型
RxJava中常见的变换操作符有
Map()
FlatMap()
ConcatMap()
Buffer()
三、变换操作符的介绍
- Map()
作用:对被观察者发送的每一个事件都通过制定的函数处理,从而变成另外一种事件。
[图片上传失败...(image-bc5634-1512547008289)]
应用场景:数据类型转换
具体使用:
以将事件的参数从整型转换成字符串类型为例
//采用RxJava基于事件流的链式操作
Observable.create(new ObservableOnSubscribe){
//1.被观察者发送事件 = 参数为整型 = 1,2,3
@Override
public void subscribr(ObservableEmitter emitter) throws Exception{
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
}).map(new Function){
//2.使用Map变换操作符中的Function()函数对被观察者发送的事件进行统一变换:整型转换为字符型
@Override
public String apply(Integer integer) throws Exception{
return
"使用 Map变换操作符 将事件" + integer +"的参数从 整型"+integer + " 变换成 字符串类型" + integer ;
}
}).subscribe(new Consumer()){
//3.观察者接收事件时,是接收到变换后的事件 = 字符串类型
@Override
public void accept(String s) throws Exception{
Log.d(TAG,s);
}
});
2.FlatMap()
作用:
将被观察者发送的事件序列进行拆分&单独转换,再合并成一个新的 事件序列,最后再进行发送。
原理:
1.为事件序列中的每个事件都创建一个Observable对象
2.将对每个原始事件转换后的新事件都放入到对应的Observable对象
3.将新建的每个Observable都合并到一个新建的、总的Observable对象
4.新建的、总的Observable对象将新合并的事件序列发送给Observer
[图片上传失败...(image-68f1ab-1512547008289)]
应用场景:
无序的将被观察者发送的整个事件序列进行变换。
具体使用:
//
采用
RxJava
基于事件流的链式操作
Observable.
create
(
new
ObservableOnSubscribe
@Override
public void
subscribe(ObservableEmitter
throws
Exception {
emitter.onNext(
1
);
emitter.onNext(
2
);
emitter.onNext(
3
);
}
}).flatMap(
new
Function
@Override
public
ObservableSource
throws
Exception {
final
List
new
ArrayList<>();
for
(
int
i =
0
; i<
3
; i++){
list.add(
"
我是事件
"
+integer+
"
拆分后的子事件
"
+i);
}
return
Observable.
fromIterable
(list);
}
}).subscribe(
new
Consumer
@Override
public void
accept(String s)
throws
Exception {
Log.
e
(
TAG
,s);
}
});
3.ConcatMap()
作用:
类似于FlatMap()操作符。
与FlatMap()的 区别在于:拆分 & 重新合并生成的事件序列 的顺序 = 被观察者旧序列生产的顺序
原理:
[图片上传失败...(image-8bcd75-1512547008289)]
应用场景:
有序的
将被观察者发送的整个事件序列进行变换
具体使用:
//
采用
RxJava
基于事件流的链式操作
Observable.
create
(
new
ObservableOnSubscribe
@Override
public void
subscribe(ObservableEmitter
throws
Exception {
emitter.onNext(
1
);
emitter.onNext(
2
);
emitter.onNext(
3
);
}
}).ConcatMap(
new
Function
@Override
public
ObservableSource
throws
Exception {
final
List
new
ArrayList<>();
for
(
int
i =
0
; i<
3
; i++){
list.add(
"
我是事件
"
+integer+
"
拆分后的子事件
"
+i);
}
return
Observable.
fromIterable
(list);
}
}).subscribe(
new
Consumer
@Override
public void
accept(String s)
throws
Exception {
Log.
e
(
TAG
,s);
}
});
4.Buffer()
作用:
定期从被观察者需要发送的事件中获取一定数量的事件放入缓存区中,最终发送。
原理:
[图片上传失败...(image-5bf8d4-1512547008289)]
应用场景:
缓存被观察者发送的事件
具体使用:
//
被观察者需要发送
5
个数字
Observable.
just
(
1
,
2
,
3
,
4
,
5
).buffer(
3
,
1
)
.subscribe(
new
Observer>() {
@Override
public void
onSubscribe(Disposable d) {
}
@Override
public void
onNext(List
Log.
d
(
TAG
,
"
缓存区里的事件数量
= "
-
stringList.size());
for
(Integer value : stringList) {
Log.
d
(
TAG
,
"
事件
= "
-
value);
} } @Override public void
onError(Throwable e) {
Log.
d
(
TAG
,
""
);
}
@Override
public void
onComplete() {
Log.
d
(
TAG
,
""
);
}
});
四. 实际开发需求案例
- 变换操作符的主要开发需求场景 = 嵌套回调(Callback hell)