RxJava學(xué)習(xí)筆記(三)

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

map
  • 代碼示例

    比如說現(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

    ?

flatmap

動(dòng)作分解

flatmap

  • 代碼示例

    現(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容