- 對事件序列中的事件 / 整個事件序列 進行加工處理(即變換),使得其轉變成不同的事件 / 整個事件序列
具體原理如下:
-
RxJava中常見的變換操作符如下:
-
數據類型轉換: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);
}
});
- FlatMap()
(1)作用:將被觀察者發送的事件序列進行 拆分 & 單獨轉換,再合併成一個新的事件序列,最後再進行發送
(2)原理:
- 爲事件序列中每個事件都創建一個 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);
}
});