RxJava常用操作符用法


按照官方的分類,操作符大致分為以下幾種:
(來源 [rxjava詳細介紹](http://blog.csdn.net/job_hesc/article/details/46242117 "rxjava詳細介紹"))
* Creating Observables(Observable的創建操作符),比如:Observable.create()、Observable.just()、Observable.from()等等;
* Transforming Observables(Observable的轉換操作符),比如:observable.map()、observable.flatMap()、observable.buffer()等等;
* Filtering Observables(Observable的過濾操作符),比如:observable.filter()、observable.sample()、observable.take()等等;
* Combining Observables(Observable的組合操作符),比如:observable.join()、observable.merge()、observable.combineLatest()等等;
* Error Handling Operators(Observable的錯誤處理操作符),比如:observable.onErrorResumeNext()、observable.retry()等等;
* Observable Utility Operators(Observable的功能性操作符),比如:observable.subscribeOn()、observable.observeOn()、observable.delay()等等;
* Conditional and Boolean Operators(Observable的條件操作符),比如:observable.amb()、observable.contains()、observable.skipUntil()等等;
* Mathematical and Aggregate Operators(Observable數學運算及聚合操作符),比如:observable.count()、observable.reduce()、observable.concat()等等;
* 其他如observable.toList()、observable.connect()、observable.publish()等等;

## 創建型操作符

### create操作符

create操作符是所有創建型操作符的“根”,也就是說其他創建型操作符最后都是通過create操作符來創建Observable的

### from操作符

from操作符是把其他類型的對象和數據類型轉化成Observable

### just操作符

just操作符也是把其他類型的對象和數據類型轉化成Observable,它和from操作符很像,只是方法的參數有所差別

### defer操作符
defer操作符是直到有訂閱者訂閱時,才通過Observable的工廠方法創建Observable並執行

### timer操作符

timer操作符是創建一串連續的數字,產生這些數字的時間間隔是一定的

### interval操作符

interval操作符是每隔一段時間就產生一個數字,這些數字從0開始,一次遞增1直至無窮大;interval操作符的實現效果跟上面的timer操作符的第二種情形一樣

### range操作符

range操作符是創建一組在從n開始,個數為m的連續數字,比如range(3,10),就是創建3、4、5…12的一組數字

### repeat/repeatWhen操作符

repeat操作符是對某一個Observable,重復產生多次結果

repeatWhen操作符是對某一個Observable,有條件地重新訂閱從而產生多次結果

## Observable的轉換操作符

### buffer

buffer操作符周期性地收集源Observable產生的結果到列表中,並把這個列表提交給訂閱者,訂閱者處理后,清空buffer列表,同時接收下一次收集的結果並提交給訂閱者,周而復始

### flatmap

把Observable產生的結果轉換成多個Observable,然后把這多個Observable“扁平化”成一個Observable,並依次提交產生的結果給訂閱者

### concatMap操作符

flatMap操作符不同的是,concatMap操作符在處理產生的Observable時,采用的是“連接(concat)”的方式,而不是“合並(merge)”的方式,這就能保證產生結果的順序性,也就是說提交給訂閱者的結果是按照順序提交的,不會存在交叉的情況

### switchMap

與flatMap操作符不同的是,switchMap操作符會保存最新的Observable產生的結果而舍棄舊的結果

### groupBy操作符

groupBy操作符是對源Observable產生的結果進行分組,形成一個類型為GroupedObservable的結果集,GroupedObservable中存在一個方法為getKey(),可以通過該方法獲取結果集的Key值

### cast操作符

而cast操作符主要是做類型轉換的

### scan操作符

scan操作符通過遍歷源Observable產生的結果,依次對每一個結果項按照指定規則進行運算,計算后的結果作為下一個迭代項參數,每一次迭代項都會把計算結果輸出給訂閱者

### window操作符

window操作符非常類似於buffer操作符,區別在於buffer操作符產生的結果是一個List緩存,而window操作符產生的結果是一個Observable,訂閱者可以對這個結果Observable重新進行訂閱處理

## Observable的過濾操作符

### debounce操作符

debounce操作符對源Observable每產生一個結果后,如果在規定的間隔時間內沒有別的結果產生,則把這個結果提交給訂閱者處理,否則忽略該結果。

### distinct操作符

distinct操作符對源Observable產生的結果進行過濾,把重復的結果過濾掉,只輸出不重復的結果給訂閱者,非常類似於SQL里的distinct關鍵字。

### elementAt操作符

elementAt操作符在源Observable產生的結果中,僅僅把指定索引的結果提交給訂閱者,索引是從0開始的

### filter操作符

filter操作符是對源Observable產生的結果按照指定條件進行過濾,只有滿足條件的結果才會提交給訂閱者

### ofType操作符

ofType操作符類似於filter操作符,區別在於ofType操作符是按照類型對結果進行過濾

### first操作符

first操作符是把源Observable產生的結果的第一個提交給訂閱者,first操作符可以使用elementAt(0)和take(1)替代

### single操作符

single操作符是對源Observable的結果進行判斷,如果產生的結果滿足指定條件的數量不為1,則拋出異常,否則把滿足條件的結果提交給訂閱者
### last操作符

last操作符把源Observable產生的結果的最后一個提交給訂閱者,last操作符可以使用takeLast(1)替代

### ignoreElements操作符

ignoreElements操作符忽略所有源Observable產生的結果,只把Observable的onCompleted和onError事件通知給訂閱者。ignoreElements操作符適用於不太關心Observable產生的結果,只是在Observable結束時(onCompleted)或者出現錯誤時能夠收到通知

### skip操作符

skip操作符針對源Observable產生的結果,跳過前面n個不進行處理,而把后面的結果提交給訂閱者處理

### skipLast操作符

skipLast操作符針對源Observable產生的結果,忽略Observable最后產生的n個結果,而把前面產生的結果提交給訂閱者處理,

### take操作符

take操作符是把源Observable產生的結果,提取前面的n個提交給訂閱者,而忽略后面的結果

### takeFirst操作符

takeFirst操作符類似於take操作符,同時也類似於first操作符,都是獲取源Observable產生的結果列表中符合指定條件的前一個或多個,與first操作符不同的是,first操作符如果獲取不到數據,則會拋出NoSuchElementException異常,而takeFirst則會返回一個空的Observable,該Observable只有onCompleted通知而沒有onNext通知。

### takeLast操作符

takeLast操作符是把源Observable產生的結果的后n項提交給訂閱者

## Observable的組合操作符

### combineLatest操作符
combineLatest操作符把兩個Observable產生的結果進行合並,合並的結果組成一個新的Observable。這兩個Observable中任意一個Observable產生的結果,都和另一個Observable最后產生的結果,按照一定的規則進行合並

### join操作符
join操作符把類似於combineLatest操作符,也是兩個Observable產生的結果進行合並,合並的結果組成一個新的Observable,但是join操作符可以控制每個Observable產生結果的生命周期

### groupJoin操作符

groupJoin操作符非常類似於join操作符,區別在於join操作符中第四個參數的傳入函數不一致

### merge操作符

merge操作符是按照兩個Observable提交結果的時間順序,對Observable進行合並

### mergeDelayError操作符

從merge操作符的流程圖可以看出,一旦合並的某一個Observable中出現錯誤,就會馬上停止合並,並對訂閱者回調執行onError方法,而mergeDelayError操作符會把錯誤放到所有結果都合並完成之后才執行

### startWith操作符

startWith操作符是在源Observable提交結果之前,插入指定的某些數據

### switchOnNext操作符

switchOnNext操作符是把一組Observable轉換成一個Observable,轉換規則為:對於這組Observable中的每一個Observable所產生的結果,如果在同一個時間內存在兩個或多個Observable提交的結果,只取最后一個Observable提交的結果給訂閱者

### zip操作符

zip操作符是把兩個observable提交的結果,嚴格按照順序進行合並,其流程圖如下:

## Observable的錯誤處理操作符

### onErrorReturn操作符

onErrorReturn操作符是在Observable發生錯誤或異常的時候(即將回調oError方法時),攔截錯誤並執行指定的邏輯,返回一個跟源Observable相同類型的結果,最后回調訂閱者的onComplete方法

### onErrorResumeNext操作符

onErrorResumeNext操作符跟onErrorReturn類似,只不過onErrorReturn只能在錯誤或異常發生時只返回一個和源Observable相同類型的結果,而onErrorResumeNext操作符是在錯誤或異常發生時返回一個Observable,也就是說可以返回多個和源Observable相同類型的結果

### onExceptionResumeNext操作符
onExceptionResumeNext操作符和onErrorResumeNext操作符類似,不同的地方在於onErrorResumeNext操作符是當Observable發生錯誤或異常時觸發,而onExceptionResumeNext是當Observable發生異常時才觸發

### retry操作符

retry操作符是當Observable發生錯誤或者異常時,重新嘗試執行Observable的邏輯,如果經過n次重新嘗試執行后仍然出現錯誤或者異常,則最后回調執行onError方法;當然如果源Observable沒有錯誤或者異常出現,則按照正常流程執行

##線程控制
* `Schedulers.io()`: I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 `Scheduler`。行為模式和 `newThread()` 差不多,區別在於 `io()` 的內部實現是是用一個無數量上限的線程池,可以重用空閑的線程,因此多數情況下 `io()` 比 `newThread()` 更有效率。不要把計算工作放在 `io()` 中,可以避免創建不必要的線程。
* `Schedulers.computation()`: 計算所使用的 `Scheduler`。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個 `Scheduler` 使用的固定的線程池,大小為 CPU 核數。不要把 I/O 操作放在 `computation()` 中,否則 I/O 操作的等待時間會浪費 CPU。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM