今天,對RxJava中的變換操作符進行學(xué)習(xí)。
一、變換操作符的作用
-
對事件序列中的事件/整個事件序列進行加工處理(
變換
),使其轉(zhuǎn)變成不同的事件/整個事件序列
具體原理如下:
[圖片上傳失敗...(image-d3d9ac-1512547008288)]
二、變換操作符的類型
RxJava中常見的變換操作符有
Map()
FlatMap()
ConcatMap()
Buffer()
三、變換操作符的介紹
- Map()
作用:對被觀察者發(fā)送的每一個事件都通過制定的函數(shù)處理,從而變成另外一種事件。
[圖片上傳失敗...(image-bc5634-1512547008289)]
應(yīng)用場景:數(shù)據(jù)類型轉(zhuǎn)換
具體使用:
以將事件的參數(shù)從整型轉(zhuǎn)換成字符串類型為例
//采用RxJava基于事件流的鏈?zhǔn)讲僮?/p>
Observable.create(new ObservableOnSubscribe<Integer>){
//1.被觀察者發(fā)送事件 = 參數(shù)為整型 = 1,2,3
@Override
public void subscribr(ObservableEmitter<Integer> emitter) throws Exception{
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
}
}).map(new Function<Integer,String>){
//2.使用Map變換操作符中的Function()函數(shù)對被觀察者發(fā)送的事件進行統(tǒng)一變換:整型轉(zhuǎn)換為字符型
@Override
public String apply(Integer integer) throws Exception{
return
"使用 Map變換操作符 將事件" + integer +"的參數(shù)從 整型"+integer + " 變換成 字符串類型" + integer ;
}
}).subscribe(new Consumer<String>()){
//3.觀察者接收事件時,是接收到變換后的事件 = 字符串類型
@Override
public void accept(String s) throws Exception{
Log.d(TAG,s);
}
});
2.FlatMap()
作用:
將被觀察者發(fā)送的事件序列進行拆分&單獨轉(zhuǎn)換,再合并成一個新的 事件序列,最后再進行發(fā)送。
原理:
1.為事件序列中的每個事件都創(chuàng)建一個Observable對象
2.將對每個原始事件轉(zhuǎn)換后的新事件都放入到對應(yīng)的Observable對象
3.將新建的每個Observable都合并到一個新建的、總的Observable對象
4.新建的、總的Observable對象將新合并的事件序列發(fā)送給Observer
[圖片上傳失敗...(image-68f1ab-1512547008289)]
應(yīng)用場景:
無序的將被觀察者發(fā)送的整個事件序列進行變換。
具體使用:
//
采用
RxJava
基于事件流的鏈?zhǔn)讲僮?/p>
Observable.
create
(
new
ObservableOnSubscribe<Integer>() {
@Override
public void
subscribe(ObservableEmitter<Integer> emitter)
throws
Exception {
emitter.onNext(
1
);
emitter.onNext(
2
);
emitter.onNext(
3
);
}
}).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);
}
return
Observable.
fromIterable
(list);
}
}).subscribe(
new
Consumer<String>() {
@Override
public void
accept(String s)
throws
Exception {
Log.
e
(
TAG
,s);
}
});
3.ConcatMap()
作用:
類似于FlatMap()操作符。
與FlatMap()的 區(qū)別在于:拆分 & 重新合并生成的事件序列 的順序 = 被觀察者舊序列生產(chǎn)的順序
原理:
[圖片上傳失敗...(image-8bcd75-1512547008289)]
應(yīng)用場景:
有序的
將被觀察者發(fā)送的整個事件序列進行變換
具體使用:
//
采用
RxJava
基于事件流的鏈?zhǔn)讲僮?/p>
Observable.
create
(
new
ObservableOnSubscribe<Integer>() {
@Override
public void
subscribe(ObservableEmitter<Integer> emitter)
throws
Exception {
emitter.onNext(
1
);
emitter.onNext(
2
);
emitter.onNext(
3
);
}
}).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);
}
return
Observable.
fromIterable
(list);
}
}).subscribe(
new
Consumer<String>() {
@Override
public void
accept(String s)
throws
Exception {
Log.
e
(
TAG
,s);
}
});
4.Buffer()
作用:
定期從被觀察者需要發(fā)送的事件中獲取一定數(shù)量的事件放入緩存區(qū)中,最終發(fā)送。
原理:
[圖片上傳失敗...(image-5bf8d4-1512547008289)]
應(yīng)用場景:
緩存被觀察者發(fā)送的事件
具體使用:
//
被觀察者需要發(fā)送
5
個數(shù)字
Observable.
just
(
1
,
2
,
3
,
4
,
5
).buffer(
3
,
1
)
.subscribe(
new
Observer<List<Integer>>() {
@Override
public void
onSubscribe(Disposable d) {
}
@Override
public void
onNext(List<Integer> stringList) {
Log.
d
(
TAG
,
"
緩存區(qū)里的事件數(shù)量
= "
-
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
,
""
);
}
});
四. 實際開發(fā)需求案例
- 變換操作符的主要開發(fā)需求場景 = 嵌套回調(diào)(Callback hell)