【RxJava】- 過濾操作符源碼分析

目錄

【RxJava】- 創(chuàng)建操作符源碼分析
【RxJava】- 變換操作符源碼分析
【RxJava】- 結(jié)合操作符源碼分析
【RxJava】- 連接操作符源碼分析

Debounce

僅在過了一段指定的時間還沒發(fā)射數(shù)據(jù)時才發(fā)射一個數(shù)據(jù)舀武。由類

ObservableDebounce
ObservableDebounceTimed

實現(xiàn)。

ObservableDebounce

被觀察者發(fā)射數(shù)據(jù)瘪匿,調(diào)用DebounceObserver的onNext方法寻馏。首先獲取上一次發(fā)射數(shù)據(jù)時保存的DebounceInnerObserver(一個跳轉(zhuǎn)中轉(zhuǎn)類)實例,如果不為null诚欠,者先取消上一次的發(fā)射任務,再進行下一數(shù)據(jù)的發(fā)射粉寞。

調(diào)用debounce傳入的數(shù)據(jù)包裝實例,然后拿到包裝后的數(shù)據(jù)進行發(fā)射仁锯。

所以如果數(shù)據(jù)發(fā)射過快翔悠,那么部分數(shù)據(jù)可能就會丟失。

ObservableDebounceTimed

發(fā)射數(shù)據(jù)是蓄愁,創(chuàng)建一個延時發(fā)射器,當延時時間到達時妇斤,調(diào)用延時發(fā)射器run方法丹拯。將發(fā)射任務交給被包裝的觀察者對象SerializedObserver實例。調(diào)用SerializedObserver實例的onNext方法發(fā)射數(shù)據(jù)乖酬。

  • SerializedObserver
    如果上一個延遲時間沒有到,新的數(shù)據(jù)發(fā)射到達時咬像,將取消上一次的延遲計劃生宛,開始新的延時計劃肮柜。

    如果上一個發(fā)射還沒有完成,處于發(fā)射中莱睁,那么新的數(shù)據(jù)被存放在一個數(shù)組中芒澜,等下一次滿足發(fā)射條件仰剿,然后循環(huán)發(fā)射所以數(shù)據(jù)。

Distinct

過濾掉重復的數(shù)據(jù)項酥馍。由

ObservableDistinct
ObservableDistinctUntilChanged
ObservableDistinct
key = Objects.requireNonNull(keySelector.apply(value), "The keySelector returned a null key");
b = collection.add(key);

得到數(shù)據(jù)阅酪,添加到集合(默認是HashSet),如果添加成功這發(fā)射數(shù)據(jù)术辐,否則不發(fā)生,這樣就可以過濾掉重復的數(shù)據(jù)項必孤。

ObservableDistinctUntilChanged

ObservableDistinctUntilChanged實現(xiàn)很簡單瑞躺,在發(fā)射數(shù)據(jù)時,先檢測是否已經(jīng)發(fā)射過數(shù)據(jù)幢哨,如果已經(jīng)發(fā)射過,就和上一個值進行比較捞镰,如果不相同就發(fā)射新的數(shù)據(jù)。

ElementAt

只發(fā)射第N項數(shù)據(jù)践樱。由

ObservableElementAtMaybe
ObservableElementAtSingle

實現(xiàn)凸丸。

ObservableElementAtMaybe

實現(xiàn)很簡單,自己查看甲雅,發(fā)射第N項數(shù)據(jù)坑填。

ObservableElementAtSingle

功能和ObservableElementAtMaybe差不多弛姜。

Filter

按照一定規(guī)則過濾妖枚。由

ObservableFilter

實現(xiàn)

代碼實現(xiàn)很簡單,調(diào)用傳入的過濾實例的test方法绝页,如果返回true者發(fā)射數(shù)據(jù),否則不發(fā)射莱没。

First

只發(fā)射第一項(或者滿足某個條件的第一項)數(shù)據(jù)酷鸦,由

ObservableElementAtSingle

實現(xiàn)。
這個上面已經(jīng)分析過了臼隔。

IgnoreElements

不發(fā)射任何數(shù)據(jù),只發(fā)射Observable的終止通知寄狼,由

ObservableIgnoreElementsCompletable

實現(xiàn)氨淌。自己看源碼泊愧,onNext中沒有任何實現(xiàn)盛正。

Last

只發(fā)射最后一項(或者滿足某個條件的最后一項)數(shù)據(jù)。由

ObservableLastMaybe
ObservableLastSingle

實現(xiàn)腋腮。在調(diào)用onComplete時壤蚜,發(fā)射最后一項數(shù)據(jù)。

Sample

定期發(fā)射Observable最近發(fā)射的數(shù)據(jù)項袜刷,由

ObservableSampleTimed
ObservableSampleWithObservable
ObservableSampleTimed

開始一個延時任務,當延時時間到達時墩蔓,執(zhí)行數(shù)據(jù)發(fā)射,具體自己看源碼奸披,很簡單。

ObservableSampleWithObservable

不同的邏輯在SerializedObserver中阵面,這個已經(jīng)在上面講解過了。

Skip

抑制Observable發(fā)射的前N項數(shù)據(jù)仑扑,由

ObservableSkip
ObservableSkipUntil
ObservableSkipWhile

實現(xiàn)置鼻。

ObservableSkip
 if (remaining != 0L) {
       remaining--;
} else {
      downstream.onNext(t);
}

很簡單,自己查看源碼箕母。

ObservableSkipUntil
@Override
public void subscribeActual(Observer<? super T> child) {
   ...
   other.subscribe(new SkipUntil(frc, sus, serial));
   source.subscribe(sus);
}

直到SkipUntil發(fā)射數(shù)據(jù),才發(fā)射后面的數(shù)據(jù)邑茄,具體自己查看源碼俊啼。

ObservableSkipWhile
public void onNext(T t) {
    if (notSkipping) {
         downstream.onNext(t);
     } else {
         boolean b;
         ...
            b = predicate.test(t);
         ...
         if (!b) {
             notSkipping = true;
             downstream.onNext(t);
          }
     }
 }

跳過滿足條件的數(shù)據(jù)項。

SkipLast

抑制Observable發(fā)射的后N項數(shù)據(jù),由

ObservableSkipLast
ObservableSkipLastTimed

實現(xiàn)授帕。

ObservableSkipLastTimed
 if (!empty && ts > now - time) {
     empty = true;
}

if (empty) {
     break;
}

發(fā)射數(shù)據(jù)是存在數(shù)組中的當時的時間,time我們傳入的間隔時間彤路,只要在now - time發(fā)射的數(shù)據(jù)都會被拋棄芥映。

Take

只發(fā)射前面的N項數(shù)據(jù),使用Take操作符讓你可以修改Observable的行為奈偏,只返回前面的N項數(shù)據(jù),然后發(fā)射完成通知丽涩,忽略剩余的數(shù)據(jù)。具體可以結(jié)合上面的內(nèi)容矢渊,里面很多和上面的類似,這里就不一一看源碼了矮男。

TakeLast

發(fā)射Observable發(fā)射的最后N項數(shù)據(jù),使用TakeLast操作符修改原始Observable避凝,你可以只發(fā)射Observable’發(fā)射的后N項數(shù)據(jù)眨补,忽略前面的數(shù)據(jù)倒脓。

總結(jié)

其實過濾操作符大多實現(xiàn)都很簡單,自己畫幾分鐘就能看懂崎弃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市线婚,隨后出現(xiàn)的幾起案子盆均,更是在濱河造成了極大的恐慌,老刑警劉巖泪姨,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诀黍,居然都是意外死亡仗处,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門吃环,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旷档,“玉大人模叙,你說我怎么就攤上這事鞋屈」拭伲” “怎么了渠啊?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贯溅。 經(jīng)常有香客問我躲查,道長,這世上最難降的妖魔是什么镣煮? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮镊折,結(jié)果婚禮上介衔,老公的妹妹穿的比我還像新娘。我一直安慰自己炎咖,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布急迂。 她就那樣靜靜地躺著蹦肴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阴幌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天渊抽,我揣著相機與錄音议忽,去河邊找鬼。 笑死,一個胖子當著我的面吹牛愤估,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播由驹,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼昔园,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了默刚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤壹若,失蹤者是張志新(化名)和其女友劉穎皂冰,沒想到半個月后养篓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡柳弄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年碧注,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍丐。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖基茵,靈堂內(nèi)的尸體忽然破棺而出壳影,到底是詐尸還是另有隱情拱层,我是刑警寧澤宴咧,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站烙肺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茬高。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一丽猬、第九天 我趴在偏房一處隱蔽的房頂上張望熏瞄。 院中可真熱鬧脚祟,春花似錦强饮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃循。三九已至斗蒋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泉沾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工姓迅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揭朝,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓潭袱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親编丘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

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

  • 一索守、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性抑片,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    無求_95dd閱讀 3,123評論 0 21
  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性敞斋,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    測天測地測空氣閱讀 637評論 0 1
  • 注:只包含標準包中的操作符,用于個人學習及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,199評論 2 8
  • ReactiveX 系列文章目錄 blockingFirst/blockingLast 阻塞直到返回第一個/最后一...
    三流之路閱讀 2,398評論 0 0
  • 記錄RxJava操作符,方便查詢(2.2.2版本) 英文文檔地址:http://reactivex.io/docu...
    凌云飛魚閱讀 826評論 0 0