RxJava操作符系列六

RxJava

RxJava操作符系列傳送門

RxJava操作符源碼
RxJava操作符系列一
RxJava操作符系列二
RxJava操作符系列三
RxJava操作符系列四
RxJava操作符系列五

前言

在上幾篇文章我們介紹了一些RxJava創(chuàng)建合呐,轉(zhuǎn)換暮的,過濾,組合淌实,輔助的一些操作符冻辩,今天我們繼續(xù)去學(xué)習(xí)RxJava的一些條件和布爾操作符,在此感謝那些閱讀文章并提出建議的同學(xué)拆祈,其實(shí)寫技術(shù)文章主要是提升自己的知識(shí)面以及對(duì)知識(shí)的理解程度恨闪,也有人說有些地方描述還不夠清晰,文筆有待提高放坏,是的咙咽,確實(shí)是這樣,描述不清晰我感覺不僅是文筆有待提高(提升空間很大)淤年,對(duì)技術(shù)的理解也需要提高(技術(shù)渣蛻變中...)钧敞。不過我相信,只要我能寫出來麸粮,這就是一種進(jìn)步溉苛,就是一個(gè)積累的過程,我會(huì)努力弄诲,加油愚战。好了,不扯了齐遵,進(jìn)入正題凤巨。

All

該操作符是判斷Observable發(fā)射的所有數(shù)據(jù)是否都滿足某一條件,它接收一個(gè)Fun1方法參數(shù)洛搀,此方法接收原始數(shù)據(jù),并返回一個(gè)布爾類型值佑淀,如果原始Observable正常終止并且每一項(xiàng)數(shù)據(jù)都滿足條件留美,就返回true;如果原始Observable的任何一項(xiàng)數(shù)據(jù)不滿足條件就返回False。當(dāng)某數(shù)據(jù)不滿足條件(返回false)時(shí)之后的數(shù)據(jù)不再發(fā)射谎砾。如下示例代碼

 Observable.just(1,2,3,4).all(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                Log.e(TAG, "call: "+integer );
                return integer<2;
            }
        }).subscribe(new Subscriber<Boolean>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted: ");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " );
            }

            @Override
            public void onNext(Boolean aBoolean) {
                Log.e(TAG, "onNext: "+aBoolean );
            }
        });

輸出日志信息

call: 1
call: 2
onNext: false
onCompleted: 

Amb

當(dāng)我們傳遞多個(gè)Observable(可接收2到9個(gè)Observable)給amb時(shí)逢倍,它只發(fā)射其中一個(gè)Observable的數(shù)據(jù)和通知:首先發(fā)送通知給amb的那個(gè),不管發(fā)射的是一項(xiàng)數(shù)據(jù)還是一個(gè)onError或onCompleted通知景图。amb將忽略和丟棄其它所有Observables的發(fā)射物较雕。


這里寫圖片描述
 Observable observable= Observable.just(1,2,3).delay(500,TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
       Observable observable1= Observable.just(4,5,6).delay(100,TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
        Observable.amb(observable,observable1).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted: ");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: ");
            }

            @Override
            public void onNext(Integer integer) {
                Log.e(TAG, "  onNext: "+integer);
            }
        });

輸出日志信息

onNext: 4
onNext: 5
onNext: 6
onCompleted:

有一個(gè)類似的對(duì)象方法ambWith。如上示例中Observable.amb(observable,observable1)改為observable.ambWith(observable1)是等價(jià)的挚币。

Contains

我們可以給Contains傳一個(gè)指定的值亮蒋,如果原始Observable發(fā)射了那個(gè)值,它返回的Observable將發(fā)射true妆毕,否則發(fā)射false慎玖,即Observable發(fā)射的數(shù)據(jù)是否包含某一對(duì)象。
示例代碼

Observable.just(1,2,3,4).contains(2)
                .subscribe(new Subscriber<Boolean>() {
                    @Override
                    public void onCompleted() {
                        Log.e(TAG, "onCompleted: " );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError: " );
                    }

                    @Override
                    public void onNext(Boolean aBoolean) {
                        Log.e(TAG, "onNext: "+aBoolean);
                    }
                });

輸出日志信息

onNext: true
onCompleted: 

isEmpty也是一種判斷是否包含的操作符笛粘,不同的是它判斷原始Observable是否沒有發(fā)射任何數(shù)據(jù)趁怔。

exists操作符與contains操作符作用相同,但是它接收的是一個(gè)Func1函數(shù)薪前,可以指定一個(gè)判斷條件润努,當(dāng)發(fā)射的數(shù)據(jù)有滿足判斷條件(返回true)就發(fā)射true,否則為false示括。

DefaultIfEmpty

該操作符簡(jiǎn)單的精確地發(fā)射原始Observable的值铺浇,如果原始Observable沒有發(fā)射任何數(shù)據(jù)正常終止(以onCompletedd的形式),DefaultIfEmpty返回的Observable就發(fā)射一個(gè)我們提供的默認(rèn)值例诀。

Observable.empty().defaultIfEmpty(1).subscribe(new Subscriber<Object>() {

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted: " );
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: ");
            }

            @Override
            public void onNext(Object object) {
                Log.e(TAG, "onNext: "+object);
            }
        });

輸出日志信息

onNext: 1
onCompleted: 

defaultIfEmpty只有在沒有發(fā)射數(shù)據(jù)時(shí)才會(huì)有效果随抠,若發(fā)射的有數(shù)據(jù),和不使用此操作符效果一樣繁涂。

SequenceEqual

該操作符會(huì)比較兩個(gè)Observable的發(fā)射物拱她,如果兩個(gè)序列是相同的(相同的數(shù)據(jù),相同的順序扔罪,相同的終止?fàn)顟B(tài))秉沼,它就發(fā)射true,否則發(fā)射false

  Observable observable=Observable.just(1,2,3);
        Observable observable1=Observable.just(1,3,2);
        Observable.sequenceEqual(observable,observable1)
                .subscribe(new Subscriber<Boolean>() {
                    @Override
                    public void onCompleted() {
                        Log.e(TAG, "onCompleted: " );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError: " );
                    }

                    @Override
                    public void onNext(Boolean aBoolean) {
                        Log.e(TAG, "onNext: " +aBoolean);
                    }
                });

執(zhí)行后輸出

onNext: false
onCompleted:

SkipUntil

SkipUntil訂閱原始的Observable矿酵,但是忽略它的發(fā)射物唬复,直到第二個(gè)Observable發(fā)射了一項(xiàng)數(shù)據(jù)那一刻,它開始發(fā)射原始Observable全肮。


這里寫圖片描述
Observable observable = Observable.just(1, 2, 3,4,5,6).delay(100, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
        Observable observable1 = Observable.just(20, 21, 22).delay(130, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
        observable.skipUntil(observable1)
               .subscribe(new Subscriber() {
                   @Override
                   public void onCompleted() {
                       Log.e(TAG, "onCompleted: " );
                   }

                   @Override
                   public void onError(Throwable e) {
                       Log.e(TAG, "onError: " );
                   }

                   @Override
                   public void onNext(Object o) {
                       Log.e(TAG, "onNext: "+o );
                   }
               });

輸出日志信息

onNext: 4
onNext: 5
onNext: 6
onCompleted: 

由于上面兩個(gè)Observable都是在一個(gè)新線程中敞咧,時(shí)間不可控,每次運(yùn)行的結(jié)果一般不會(huì)相同辜腺。但是都會(huì)符合上面所述規(guī)則休建,可參考上圖乍恐。

SkipWhile

該操作符也是忽略它的發(fā)射物,直到我們指定的某個(gè)條件變?yōu)閒alse的那一刻测砂,它開始發(fā)射原始Observable茵烈。切記是判斷條件返回false時(shí)開始發(fā)射數(shù)據(jù)。
示例代碼

 Observable.range(1,5).skipWhile(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                Log.e(TAG, "call: "+integer);
                return integer<3;
            }
        }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted: " );
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " );
            }

            @Override
            public void onNext(Integer integer) {
                Log.e(TAG, "onNext: " +integer);
            }
        });

輸出日志信息

call: 1
call: 2
call: 3
onNext: 3
onNext: 4
onNext: 5
onCompleted: 

TakeUntil

如果我們理解了SkipUntil操作符了砌些,那么這個(gè)操作符也就很好理解了呜投,該操作符與SkipUntil有點(diǎn)相反的意思。
這里寫圖片描述

通過上圖你應(yīng)該也看出來和SkipUntil的區(qū)別存璃,當(dāng)?shù)诙€(gè)Observable發(fā)射了一項(xiàng)數(shù)據(jù)或者終止時(shí)仑荐,丟棄原始Observable發(fā)射的任何數(shù)據(jù)(SkipUntil則是丟棄之前數(shù)據(jù),發(fā)射之后的數(shù)據(jù))有巧。

Observable observable = Observable.just(1, 2, 3,4,5,6).delay(100, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
        Observable observable1 = Observable.just(20, 21, 22).delay(120, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.newThread());
        observable.takeUntil(observable1)
                .subscribe(new Subscriber() {
                    @Override
                    public void onCompleted() {
                        Log.e(TAG, "onCompleted: " );
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError: " );
                    }

                    @Override
                    public void onNext(Object o) {
                        Log.e(TAG, "onNext: "+o );
                    }
                });

輸出日志信息(每次執(zhí)行的輸出結(jié)果一般不相同)

onNext: 1
onNext: 2
onNext: 3
onNext: 4
onCompleted: 

TakeWhile

該操作符發(fā)射原始Observable释漆,直到我們指定的某個(gè)條件不成立的那一刻,它停止發(fā)射原始Observable(skipWhile此時(shí)開始發(fā)射)篮迎,并終止自己的Observable男图。

 Observable.range(1,5).takeWhile(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                Log.e(TAG, "call: "+integer);
                return integer<3;
            }
        }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted: " );
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError: " );
            }

            @Override
            public void onNext(Integer integer) {
                Log.e(TAG, "onNext: " +integer);
            }
        });

輸出日志信息

call: 1
onNext: 1
call: 2
onNext: 2
call: 3
onCompleted: 

今天的這篇文章到這里就結(jié)束了,若文中有錯(cuò)誤的地方甜橱,歡迎指正逊笆。謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岂傲,一起剝皮案震驚了整個(gè)濱河市难裆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镊掖,老刑警劉巖乃戈,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亩进,居然都是意外死亡症虑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門归薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谍憔,“玉大人,你說我怎么就攤上這事主籍∠捌叮” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵千元,是天一觀的道長(zhǎng)苫昌。 經(jīng)常有香客問我,道長(zhǎng)幸海,這世上最難降的妖魔是什么蜡歹? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任屋厘,我火速辦了婚禮,結(jié)果婚禮上月而,老公的妹妹穿的比我還像新娘。我一直安慰自己议纯,他們只是感情好父款,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞻凤,像睡著了一般憨攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阀参,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天肝集,我揣著相機(jī)與錄音,去河邊找鬼蛛壳。 笑死杏瞻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衙荐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼差导!你這毒婦竟也來了曾撤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤溜族,失蹤者是張志新(化名)和其女友劉穎讹俊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煌抒,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仍劈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摧玫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耳奕。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诬像,靈堂內(nèi)的尸體忽然破棺而出屋群,到底是詐尸還是另有隱情,我是刑警寧澤坏挠,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布芍躏,位于F島的核電站,受9級(jí)特大地震影響降狠,放射性物質(zhì)發(fā)生泄漏对竣。R本人自食惡果不足惜庇楞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望否纬。 院中可真熱鬧吕晌,春花似錦、人聲如沸临燃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膜廊。三九已至乏沸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爪瓜,已是汗流浹背蹬跃。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铆铆,地道東北人蝶缀。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像算灸,于是被迫代替她去往敵國(guó)和親扼劈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容