RxJava日常使用總結(jié)(七)條件和布爾值操作

這篇英遭,我們講幾個(gè)條件判斷和布爾值操作相關(guān)的操作符延届。

All操作符。判定是否Observable發(fā)射的所有數(shù)據(jù)都滿足某個(gè)條件跟伏。就是判斷某個(gè)數(shù)據(jù)源發(fā)射的數(shù)據(jù)是否符合規(guī)則,然后輸出一個(gè)Boolean類(lèi)型的返回值翩瓜。(這里有小伙伴就會(huì)問(wèn)了受扳,這效果和filter不是一樣的嗎?其實(shí)的確是一樣的兔跌,只是filter不會(huì)改變上游的數(shù)據(jù)類(lèi)型勘高,而all操作符則強(qiáng)制輸出類(lèi)型為Boolean值類(lèi)型,所以使用all還是filter坟桅,看場(chǎng)景华望。)

image.png
  • 例如,在一個(gè)問(wèn)題列表中仅乓,點(diǎn)擊條目赖舟,跳轉(zhuǎn)到聊天室,自動(dòng)發(fā)送多條問(wèn)題消息夸楣。(有點(diǎn)像京東宾抓、天貓找客服,自動(dòng)發(fā)一些確定的問(wèn)題)
    /**
     * 自動(dòng)批量發(fā)送消息
     */
    public Observable<Boolean> autoSendMsgList(ArrayList<AutoSendMsgModel> autoSendMsgList) {
        return Observable.fromIterable(autoSendMsgList)
                .flatMap(new Function<AutoSendMsgModel, ObservableSource<Boolean>>() {
                    @Override
                    public ObservableSource<Boolean> apply(AutoSendMsgModel model) throws Exception {
                        return sendTextMsg(model.getMsg());
                    }
                })
                .all(new Predicate<Boolean>() {
                    @Override
                    public boolean test(Boolean isSuccess) throws Exception {
                        return isSuccess;
                    }
                }).toObservable();
    }
  • all操作符豫喧,判定每次發(fā)送的消息的返回結(jié)果都要為true石洗,才算發(fā)送成功。

Amb操作符紧显。給定兩個(gè)或多個(gè)Observables讲衫,它只發(fā)射首先發(fā)射數(shù)據(jù)或通知的那個(gè)Observable的所有數(shù)據(jù),其他被拋棄孵班。意思就是競(jìng)爭(zhēng)涉兽,誰(shuí)先發(fā)送事件招驴,誰(shuí)就贏。不管是onNext()花椭,還是onError或onCompleted()事件忽匈。

image.png
  • 這個(gè)場(chǎng)景就很好理解了,例如我們請(qǐng)求接口前矿辽,先去找內(nèi)存緩存,再找本地緩存郭厌,最后沒(méi)有緩存可用袋倔,就請(qǐng)求接口數(shù)據(jù),如果有緩存折柠,那接口就不請(qǐng)求了宾娜。
Observable.ambArray(
                                Observable.create(new ObservableOnSubscribe<List<SearchTagModel>>() {
                                    @Override
                                    public void subscribe(ObservableEmitter<List<SearchTagModel>> emitter) throws Exception {
                                        if (mHotTagCacheList.size() > 0) {
                                            emitter.onNext(mHotTagCacheList);
                                            emitter.onComplete();
                                        }
                                    }
                                })
                                        .map(new Function<List<SearchTagModel>, BaseSearchModel>() {
                                            @Override
                                            public BaseSearchModel apply(List<SearchTagModel> tagModels) throws Exception {
                                                mHotTagList.clear();
                                                mHotTagList.addAll(tagModels);
                                                return new HotSearchModel(tagModels);
                                            }
                                        }),
                                //熱門(mén)搜索
                                mClient.requestTagsInObservable(TAG)
                                        .filter(new Predicate<HttpModel<List<SearchTagModel>>>() {
                                            @Override
                                            public boolean test(HttpModel<List<SearchTagModel>> httpModel) throws Exception {
                                                return httpModel.getData() != null && httpModel.getData().size() > 0;
                                            }
                                        })
                                        .map(new Function<HttpModel<List<SearchTagModel>>, BaseSearchModel>() {
                                            @Override
                                            public BaseSearchModel apply(HttpModel<List<SearchTagModel>> httpModel) throws Exception {
                                                //緩存
                                                mHotTagCacheList.clear();
                                                mHotTagCacheList.addAll(httpModel.getData());
                                                mHotTagList.clear();
                                                mHotTagList.addAll(httpModel.getData());
                                                return new HotSearchModel(httpModel.getData());
                                            }
                                        }))
  • 例如搜索功能,熱門(mén)搜索扇售,如果之前在前面一個(gè)界面已經(jīng)請(qǐng)求過(guò)了前塔,則可以直接帶數(shù)據(jù)過(guò)來(lái),直接使用承冰,不再調(diào)接口拿华弓。再或者前面沒(méi)有請(qǐng)求過(guò),沒(méi)有緩存困乒,則請(qǐng)求接口寂屏,再將數(shù)據(jù)緩存到集合(內(nèi)存緩存)。

Contains操作符娜搂。判定一個(gè)Observable是否發(fā)射一個(gè)特定的值迁霎,并返回一個(gè)Boolean結(jié)果值。效果就是List集合.contains(object)的效果百宇,判斷某個(gè)值是否存在集合中考廉,在RxJava中,Contains操作符就是判斷某個(gè)數(shù)據(jù)集是否發(fā)出過(guò)指定的事件值携御。

image.png
  • 例如昌粤,遍歷列表數(shù)據(jù)集,判斷是否存在某個(gè)類(lèi)型的條目因痛,存在或不存在做某些操作婚苹。
Object model = ...
        Items items = new Items();
        Observable.fromIterable(items)
                .contains(model)
                .as(RxLifecycleUtil.bindLifecycle(this))
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean isContains) throws Exception {
                        //...
                    }
                });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸵膏,隨后出現(xiàn)的幾起案子膊升,更是在濱河造成了極大的恐慌,老刑警劉巖谭企,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廓译,死亡現(xiàn)場(chǎng)離奇詭異评肆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)非区,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)瓜挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人征绸,你說(shuō)我怎么就攤上這事久橙。” “怎么了管怠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵淆衷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我渤弛,道長(zhǎng)祝拯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任她肯,我火速辦了婚禮佳头,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晴氨。我一直安慰自己康嘉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布瑞筐。 她就那樣靜靜地躺著凄鼻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聚假。 梳的紋絲不亂的頭發(fā)上块蚌,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音膘格,去河邊找鬼峭范。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瘪贱,可吹牛的內(nèi)容都是我干的纱控。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼菜秦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甜害!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起球昨,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尔店,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嚣州,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲫售,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了该肴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片情竹。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匀哄,靈堂內(nèi)的尸體忽然破棺而出秦效,到底是詐尸還是另有隱情,我是刑警寧澤涎嚼,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布棉安,位于F島的核電站,受9級(jí)特大地震影響铸抑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衷模,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一鹊汛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阱冶,春花似錦刁憋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至镊叁,卻和暖如春尘颓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晦譬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工疤苹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敛腌。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓卧土,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親像樊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尤莺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355