RxJava-操作符
來源:程序員人生 發布時間:2016-07-20 09:07:20 閱讀次數:2526次
基本定義
- Observable – 被視察者(事件源)
- Observer – 視察者
Creating Observables(創建操作)
以下展現了創建Observable的各種方法
- Create — 通過observer的方法創建1個新的Observable
- Defer — 直到observer定閱的時候才會創建這個Observable,并且為每個observer創建1個Observable
- Empty/Never/Throw — 創建行動受限特殊的Observable
Empty — 只會發射onCompleted事件
Never — 不會發射任事件和數據
Throw — 只會發射onError
- From — 將現有的1些對象集或數據結構轉換到1個Observable里,然后逐一發射
- Interval — 返回1個Observable,它按固定的時間間隔發射1個無窮遞增的整數序列。
- Just — 類似from,但just只是單純的把傳入對象發射出去,from會把列表中數據取出來逐一發射
- Range — 創建1個發射指定范圍內的有序整數序列的Observable
- Repeat — 指定當前Observable可以重復發射
- Start — 返回1個Observable,它發射1個類似于函數聲明的返回值
- Timer — 創建1個延時發射的Observable
以下是可用于對Observable發射的數據履行變換操作的各種操作符
- Buffer — 可以理解為緩存,定期從Observable中搜集數據放進1個數據包裹,然后把這些數據打包發射,而不是1次發射1個值。
- FlatMap — 使用1個指定的函數對原始Observable發射的每項數據履行變換操作,這個函數返回1個本身也發射數據的Observable,然后FlatMap合并這些Observables發射的數據,最后將合并后的結果當作它自己的數據序列發射。
- GroupBy — 將原始Observable按不同的key分組拆分為1些Observables集合,key相同的數據會被同1個Observable發射。
- Map — 將Observable發射的數據通過1個函數進行變換,然后返回1個發射這些結果的Observable。
- Scan — 將發射的數據通過1個函數進行變換,然后將變換后的結果作為參數跟下1個發射的數據1起繼續通過那個函數變換,這樣順次連續發射得到終究結果
- Window — 定期將來自原始Observable的數據分解為1個Observable窗口,發射這些窗口,而不是每次發射1項數據,
Window和Buffer類似,但不是發射來自原始Observable的數據包,它發射的是Observables,這些Observables中的每個都發射原始Observable數據的1個子集,最后發射1個onCompleted通知。
Filtering Observables(過濾操作)
- Debounce — 僅在過了1段指定的時間還沒發射數據時才發射1個數據,Debounce操作符會過濾掉發射速率過快的數據項,意思就是在指定時間內如果發射過量個數據,在最后只會發射最近的哪次數據。
- Distinct — 過濾掉重復的數據項
- ElementAt — 只發射第N項數據
- Filter — 只發射過濾函數返回true的數據項
- First — 只發射第1項(或滿足某個條件的第1項)數據
- IgnoreElements — 不發射任何數據,只發射Observable的終止通知(onError、onCompleted),當你不關心發射數據,只關心成功與否時可使用該操作符。
- Last — 只發射最后1項(或滿足某個條件的最后1項)數據
- Sample — 定期發射Observable最近發射的數據項
- Skip — 過濾Observable發射的前N項數據
- SkipLast — 過濾Observable發射的后N項數據
- Take — 只發射Observable發射的前面的N項數據
- TakeLast — 只發射Observable發射的最后N項數據
Combining Observables(結合操作)
以下操作符可用于組合多個Observables。
- And/Then/When — 使用Pattern和Plan作為中介,將兩個或多個Observable發射的數據集合并到1起。
And/Then/When操作符組合的行動類似于zip,但是它們使用1個中間數據結構。接受兩個或多個Observable,1次1個將它們的發射物合并到Pattern對象,然后操作那個Pattern對象,變換為1個Plan。隨后將這些Plan變換為Observable的發射物。
- CombineLatest — 當兩個Observables中的任何1個發射了數據時,使用1個函數結合每一個Observable發射的最近數據項,并且基于這個函數的結果發射數據,多個同理。
- Join — 任什么時候候,只要在另外一個Observable發射的數據定義的時間范圍內,這個Observable發射了1條數據,就結合兩個Observable發射的數據;換句話說,在其中1個Observable發射數據時,只要另外一個Observable發射的數據還沒過期(會有2個函數定義各自的有效時間窗口),就結合2個Observable發射的數據。
- Merge — 可以將多個Observables的輸出合并,就好像它們是1個單個的Observable1樣。
- StartWith — 在發射數據最前面添加發射數據項。
- Switch — 將1個發射多個Observables的Observable轉換成另外一個單獨的Observable,后者發射最近1個被發射的Observable的發射物,意味著在最近被發射的Observable之前被發射的Observable的發射物都將被拋棄。
通俗點講,先前發射Observables中A的發射物,切換后就開始發B的發射物了。。
- Zip — 通過1個函數合并多個Observable數據發射項,基于這個函數結果為每一個合并項發射單個數據項。
Error Handling Operators(毛病處理)
很多操作符可用于對Observable發射的onError通知做出響應或從毛病中恢復,例如,你可以:
- 吞掉這個毛病,切換到1個備用的Observable繼續發射數據
- 吞掉這個毛病然后發射默許值
- 吞掉這個毛病并立即嘗試重啟這個Observable
- 吞掉這個毛病,在1些回退間隔后重啟這個Observable
這是操作符列表:
Catch:
- onErrorResumeNext — 唆使Observable在遇到毛病時發射1個數據序列
- onErrorReturn — 唆使Observable在遇到毛病時發射1個特定的數據
- onExceptionResumeNext — instructs an Observable to continue
emitting items after it encounters an exception (but not another
variety of throwable)唆使Observable遇到毛病時繼續發射數據
Retry:
- retry — 唆使Observable遇到毛病時重試
- retryWhen — 唆使Observable遇到毛病時,將毛病傳遞給另外一個Observable來決定是不是要重新給定閱這個Observable
Observable Utility Operators(輔助操作)
- Delay — 延遲1段指定的時間再發射來自Observable的發射物
- Do — 相當于注冊1個跟Observable某1個生命周期相干的1個回調方法,比如doOnNext、doOnError等等。
- Materialize — Materialize將數據項和事件通知都當作數據項封裝成Notification對象發射,Dematerialize恰好相反。
- ObserveOn — 指定1個視察者在哪一個調度器上視察這個Observable,RxJava上調度器就是不同線程。
- Serialize — 強迫1個Observable連續調用并保證行動正確,保證行動正確是指調用視察者的事件方法順序正確調用,由于我們的視察方法多是從不同線程異步調用的,便可能會致使行動不正確,使用serialize可以糾正。
- Subscribe — 操作來自Observable的發射物和通知;
Subscribe操作符是連接視察者和Observable的膠水。1個視察者要想看到Observable發射的數據項,或想要從Observable獲得毛病和完成通知,它首先必須使用這個操作符定閱那個Observable。
Subscribe操作符的1般實現可能會接受1到3個方法(然后由視察者組合它們),或接受1個實現了包括這3個方法的接口的對象(有時叫做Observer或Subscriber):
- onNext — 每當Observable發射了1項數據它就會調用這個方法。這個方法的參數是這個Observable發射的數據項。
- onError — 當Observable沒法生成期待的數據或遇到其他問題時會調用此方法,參數是1個Exception或Throwable。
- onCompleted — 如果沒有遇到任何毛病,Observable再最后會調用這個方法。
- SubscribeOn — 指定Observable本身在哪一個調度器上履行。
- TimeInterval — 將1個發射數據的Observable轉換為發射那些數據發射時間間隔的Observable,即新Observable只發射舊Observable相鄰2個發射物之間的發射時間間隔,第1個時間間隔為原始Observable剛開始定閱到發射第1個數據項之間的時間間隔。
- TimeOut — 指定時長內,如果Observable還沒有發射數據,則發送1個毛病通知,多是onError,也多是切換到1個備用Observable,RxJava有幾種的實現變體。
- TimeStamp — 給Observable發射的數據項附加1個時間戳,RxJava中的實現為timestamp,它將1個發射T類型數據的Observable轉換為1個發射類型為Timestamped的數據的Observable,每項都包括數據的原始發射時間。
Using — 該操作符讓你可以唆使Observable創建1個只在它的生命周期內存在的資源,當Observable終止時這個資源會被自動釋放。
using操作符接受3個參數:
- 1個用戶創建1次性資源的工廠函數
- 1個用于創建Observable的工廠函數
- 1個用于釋放資源的函數
當1個視察者定閱using返回的Observable時,using將會使用Observable工廠函數創建視察者要視察的Observable,同時使用資源工廠函數創建1個你想要創建的資源。當視察者取消定閱這個Observable時,或當視察者終止時(不管是正常終止還是因毛病而終止),using使用第3個函數釋放它創建的資源。
To — 將Observable轉換為另外一個對象或數據結構。
該操作符讓你可以將Observable或Observable發射的數據序列轉換為另外一個對象或數據結構,然后返回1個發射那個對象或數據結構的Observable。
Conditional and Boolean Operators(條件和布爾操作)
以下操作符可用于根據條件發射或變換Observables,或對它們做布爾運算。
- All — 提供1個函數判斷1個Observable的所有發射數據項是不是滿足某個條件。
- Amb — 給定兩個或多個Observables,它只發射首先發射數據或通知的那個Observable的所有數據,拋棄其他Observable發射的數據。
- Contains — 判定1個Observable是不是發射1個特定的值。
- DefaultIfEmpty — 發射來自原始Observable的值,如果原始Observable沒有發射任何值,就發射1個默許值。
- SequenceEqual — 傳遞兩個Observable給SequenceEqual操作符,它會比較兩個Observable的發射物,如果兩個序列是相同的(相同的數據,相同的順序,相同的終止狀態),它就發射true,否則發射false。
- SkipUtil — 拋棄原始Observable發射的數據,直到第2個Observable發射了1項數據。
SkipUntil定閱原始的Observable,但是疏忽它的發射物,直到第2個Observable發射了1項數據那1刻,它開始發射原始Observable。
- SkipWhile — 拋棄Observable發射的數據,直到1個指定的條件不成立。
SkipWhile定閱原始的Observable,但是疏忽它的發射物,直到你指定的某個條件變成false的那1刻,它開始發射原始Observable。
- TakeUtil — 當第2個Observable發射了1項數據或終止時,拋棄原始Observable后面發射的任何數據。
TakeUntil定閱并開始發射原始Observable,它還監視你提供的第2個Observable。如果第2個Observable發射了1項數據或發射了1個終止通知,TakeUntil返回的Observable會停止發射原始Observable并終止。
- TakeWhile — 發射Observable發射的數據,直到1個指定的條件不成立。
TakeWhile發射原始Observable,直到你指定的某個條件不成立的那1刻,它停止發射原始Observable,并終止自己的Observable。
Mathematical and Aggregate Operators(算術和聚合操作)
下面的操作符用于對全部序列履行算法操作或其它操作,由于這些操作必須等待數據發射完成(通常也必須緩存這些數據),它們對非常長或無窮的序列來講是危險的,不推薦使用。
- Average — 計算原始Observable發射數字的平均值并發射它。
- Concat — 不交錯的發射兩個或多個Observable的發射物,即Observable是1個1個履行發射的,第1個發射終了第2個Observable才會開始發射。
- Count — 計算原始Observable發射物的數量,然后只發射這個值。
- Max — 發射原始Observable的最大值。
- Min — 發射原始Observable的最小值。
- Reduce — 按順序對Observable發射的每項數據利用1個函數并發射終究的值。
- Sum — 計算Observable發射的數值的和并發射這個和。
Connectable Observable Operators(連接操作)
- Publish — 將普通的Observable轉換為可連接的Observable。
可連接的Observable (connectable Observable)與普通的Observable差不多,不過它其實不會在被定閱時開始發射數據,而是直到使用了Connect操作符時才會開始。用這個方法,你可以等待所有的視察者都定閱了Observable以后再開始發射數據。
- Connect — 讓1個可連接的Observable開始發射數據給定閱者。
RxJava中connect是ConnectableObservable接口的1個方法。
- RefCount — 讓1個可連接的Observable行動像普通的Observable。
RefCount操作符把從1個可連接的Observable連接和斷開的進程自動化了。它操作1個可連接的Observable,返回1個普通的Observable。當第1個定閱者定閱這個Observable時,RefCount連接到下層的可連接Observable。RefCount跟蹤有多少個視察者定閱它,直到最后1個視察者完成才斷開與下層可連接Observable的連接。
- Replay — 保證所有的視察者收到相同的數據序列,即便它們在Observable開始發射數據以后才定閱。
經常使用的操作符基本都在上面了,固然還有海量的操作符需要平時用到的時候去積累了~
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈