Map與FlatMap
map
-
基礎(chǔ)概念
map 是 RxJava中 最常見的變換操作符之一。
它的作用就是對(duì) Observable 發(fā)送的每一個(gè)事件應(yīng)用一個(gè)函數(shù), 使得每一個(gè)事件都按照指定的函數(shù)去變化喂链。
通俗的說,就是把被觀察者發(fā)送事件里面的對(duì)象轉(zhuǎn)換成你需要的對(duì)象胚想,然后發(fā)送給觀察者
-
看圖識(shí)字
map把 Observable 里的圓形一個(gè)個(gè)轉(zhuǎn)換成方形,然后發(fā)射出去給 observer
-
代碼示例
比如說現(xiàn)在我需要把一個(gè)圖片連接下載到bitmap對(duì)象然后設(shè)置圖片
mObservable.map(new Func1<String, Bitmap>() { @Override public Bitmap call(String url) { return getBitmapFormUrl(url); } }).subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { // 參數(shù)類型 Bitmap imageView.setImageBitmap(bitmap); } }); //Func1方法里,第一個(gè)泛型是接受轉(zhuǎn)換的數(shù)據(jù)類型声畏,第二個(gè)參數(shù)是轉(zhuǎn)換后的數(shù)據(jù)類型
flatMap
-
基礎(chǔ)概念
FlatMap 將一個(gè)發(fā)送事件的上游 Observable 變換為多個(gè)發(fā)送事件的 Observables ,然后將它們發(fā)射的事件合并后放進(jìn)一個(gè)單獨(dú)的 Observable 里
-
看圖識(shí)字
Observable 發(fā)送了3個(gè)事件娄帖,分別是圓形的1也祠、2、3
flatMap 將3個(gè)圓形事件轉(zhuǎn)換成發(fā)送三角形和正方形的事件近速,生成一個(gè)新的 Observable
?
動(dòng)作分解
-
代碼示例
現(xiàn)在我們有一個(gè)需求诈嘿,用戶需要先請(qǐng)求一個(gè)接口獲得 token ,然后根據(jù) token 再請(qǐng)求數(shù)據(jù)獲取 user 信息削葱,讓我們用示例代碼試試吧奖亚。
//TODO 1.聲明一個(gè)獲取token的觀察者 Observable<String> getTokenObservable = .....;
//TODO 2.將獲取token的觀察者轉(zhuǎn)換成獲取user的觀察者
Observable<UserAdapter> getUserObservable = getTokenObservable.flatMap(new Func1<String, Observable<User>>() {
@Override
public Observable<User> call(String token) {
return getUserObservable(token);//這里有一個(gè)獲取UserObservable的方法
}
});
//TODO 3.觀察者訂閱獲取user的被觀察者
getUserObservable.subscribe(new Action1<User>() {
@Override
public void call(User user) {
//成功拿到user
}
});
//動(dòng)作合并,更優(yōu)雅的寫法
getTokenObservable.flatMap(new Func1<String, Observable<User>>() {
@Override
public Observable<User> call(String token) {
return getUserObservable(token);
}
}).subscribe(new Action1<User>() {
@Override
public void call(User userAdapter) {
//成功拿到user
}
});
```
-
特別聲明
flatMap 并不保證事件的順序析砸,就是說上面的圖剛開始發(fā)送123轉(zhuǎn)換后昔字,觀察者接收到的可能就是213了。如果需要保證事件順序可以使用 concatMap