RxJava操作符圖譜
創建操作符
create
完整創建1個被觀察者對象(Observable)
just
- 快速創建1個被觀察者對象(Observable)
- 發送事件的特點:直接發送 傳入的事件
快速創建 被觀察者對象(Observable) & 發送10個以下事件
from
fromeArray
- 快速創建1個被觀察者對象(Observable)
- 發送事件的特點:直接發送 傳入的數組數據
將數組元素一次發射出,可以用來遍歷數組
fromIterable
- 快速創建1個被觀察者對象(Observable)
- 發送事件的特點:直接發送 傳入的集合List數據
同上,可用來遍歷集合
發送事件
下列方法一般用于測試使用
<-- empty() -->
// 該方法創建的被觀察者對象發送事件的特點:僅發送Complete事件,直接通知完成
Observable observable1=Observable.empty();
// 即觀察者接收后會直接調用onCompleted()
<-- error() -->
// 該方法創建的被觀察者對象發送事件的特點:僅發送Error事件,直接通知異常
// 可自定義異常
Observable observable2=Observable.error(new RuntimeException())
// 即觀察者接收后會直接調用onError()
<-- never() -->
// 該方法創建的被觀察者對象發送事件的特點:不發送任何事件
Observable observable3=Observable.never();
// 即觀察者接收后什么都不調用
延時操作符
- 定時操作:在經過了x秒后,需要自動執行y操作
- 周期性操作:每隔x秒后,需要自動執行y操作
delay
使得被觀察者延遲一段時間再發送事件
// 1. 指定延遲時間
// 參數1 = 時間;參數2 = 時間單位
delay(long delay,TimeUnit unit)
// 2. 指定延遲時間 & 調度器
// 參數1 = 時間;參數2 = 時間單位;參數3 = 線程調度器
delay(long delay,TimeUnit unit,mScheduler scheduler)
// 3. 指定延遲時間 & 錯誤延遲
// 錯誤延遲,即:若存在Error事件,則如常執行,執行后再拋出錯誤異常
// 參數1 = 時間;參數2 = 時間單位;參數3 = 錯誤延遲參數
delay(long delay,TimeUnit unit,boolean delayError)
// 4. 指定延遲時間 & 調度器 & 錯誤延遲
// 參數1 = 時間;參數2 = 時間單位;參數3 = 線程調度器;參數4 = 錯誤延遲參數
delay(long delay,TimeUnit unit,mScheduler scheduler,boolean delayError): 指定延遲多長時間并添加調度器,錯誤通知可以設置是否延遲
defer
直到有觀察者(Observer )訂閱時,才動態創建被觀察者對象(Observable) & 發送事件
- 通過 Observable工廠方法創建被觀察者對象(Observable)
- 每次訂閱后,都會得到一個剛創建的最新的Observable對象,這可以確保Observable對象里的數據是最新的
<-- 1. 第1次對i賦值 ->>
Integer i = 10;
// 2. 通過defer 定義被觀察者對象
// 注:此時被觀察者對象還沒創建
Observable<Integer> observable = Observable.defer(new Callable<ObservableSource<? extends Integer>>() {
@Override
public ObservableSource<? extends Integer> call() throws Exception {
return Observable.just(i);
}
});
<-- 2. 第2次對i賦值 ->>
i = 15;
<-- 3. 觀察者開始訂閱 ->>
// 注:此時,才會調用defer()創建被觀察者對象(Observable)
observable.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "開始采用subscribe連接");
}
@Override
public void onNext(Integer value) {
Log.d(TAG, "接收到的整數是"+ value );
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "對Error事件作出響應");
}
@Override
public void onComplete() {
Log.d(TAG, "對Complete事件作出響應");
}
});
timer
- 快速創建1個被觀察者對象(Observable)
- 發送事件的特點:延遲指定時間后,發送1個數值0(Long類型)
timer操作符默認運行在一個新線程上
也可自定義線程調度器(第3個參數):timer(long, TimeUnit, Scheduler)
interval
快速創建1個被觀察者對象(Observable)
-
發送事件的特點:每隔指定時間就發送事件
/** * initialDelay 初始延時時間 * unit 時間單位 * period 間隔時間 * scheduler 線程調度器 */ public static Observable<Long> interval(long interval, TimeUnit unit) { return interval(interval, interval, unit, Schedulers.computation()); } public static Observable<Long> interval(long interval, TimeUnit unit, Scheduler scheduler) { return interval(interval, interval, unit, scheduler); } public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit) { return interval(initialDelay, period, unit, Schedulers.computation()); }
range/rangeLong
快速創建1個被觀察者對象(Observable)
-
發送事件的特點:連續發送1個事件序列,可指定范圍
/** * start 起始數字 * count 數量 */ public static Observable<Integer> range(int start, int count)
過濾操作符
take, takeFirst, takeLast
skip, skipFirst, skipLast
first
last
-
firstOrDefault, lastOrDefault (只發射最后一項(或者滿足某個條件的最后一項)數據,可以指定默認值。)
// 跳過前面幾項 public final Observable<T> skip(int count) // 跳過前面的時間,之后產生的數據提交 public final Observable<T> skip(long time, TimeUnit unit) // skipLast和skip相反,跳過后面的幾項。 // 忽略最后時間單位內產生的數據 skipLast(long time,TimeUnit) // 并不是娶第n個,而是取前面n個數據 take(n) // 是在制定時間內取數據,如果超過了這個時間源Observable產生的數據將作廢 take(long time, TimeUnit unit)
takeFirst操作符和first操作符類似,取滿足條件的第一個
區別:first取不到要拋異常,takeFirst不會takeLast操作符與last操作符相似。區別在于,如果取不到滿足條件的值,last將拋出異常
filter
過濾數據,不滿足條件的數據將被過濾不發射。
filter(Fun) 自定義過濾條件
ofType
過濾指定類型的數據
Observable.just(1,2,"3")
.ofType(Integer.class)
.subscribe(item -> Log.d("JG",item.toString()));
elementAt/elementAtOrDefault/elementAtOrError
發射某一項數據,如果超過了范圍可以指定默認值。內部通過OperatorElementAt過濾。
Observable.just(3,4,5,6)
.elementAt(2)
.subscribe(item->Log.d("JG",item.toString())); //5
firstElement/lastElement
僅選取第1個元素 / 最后一個元素
ignoreElements
丟棄所有數據,只發射錯誤或正常終止的通知。內部通過OperatorIgnoreElements實現。
distinct
過濾重復數據,內部通過OperatorDistinct實現。
distinctUntilChanged
過濾掉連續重復的數據。內部通過OperatorDistinctUntilChanged實現
Observable.just(3,4,5,6,3,3,4,9)
.distinctUntilChanged()
.subscribe(item->Log.d("JG",item.toString())); //3,4,5,6,3,4,9
timeout
如果原始Observable過了指定的一段時長沒有發射任何數據,就發射一個異常或者使用備用的Observable。
Debounce/throtleWithTimeout
根據你指定的時間間隔進行限流
發送數據事件時,若2次發送事件的間隔<指定時間,就會丟棄前一次的數據,直到指定時間內都沒有新數據發射時才會發送后一次的數據
條件操作符
single/singleOrDefault
檢測源Observable產生的數據項是否只有一個,否則報錯
onError()
java.lang.IllegalArgumentException: Sequence contains too many elements
all
all操作符接收一個函數參數,創建并返回一個單布爾值的Observable,
如果原Observable正常終止并且每一項數據都滿足條件,就返回true,
如果原Observable的任何一項數據不滿足條件或者非正常終止就返回False。
判斷所有的數據項是否滿足某個條件,內部通過OperatorAll實現。
amb/ambWith
amb操作符對于給定兩個或多個Observables,它只發射首先發射數據或通知的那個Observable的所有數據。
當你傳遞多個Observable給amb操作符時,該操作符只發射其中一個Observable的數據和通知:首先發送通知給amb操作符的的那個Observable,不管發射的是一項數據還是一個onError或onCompleted通知,amb將忽略和丟棄其它所有Observables的發射物。
amb(T o1, T ... o2)(可接受2到9個參數)
給定多個Observable,只讓第一個發射數據的Observable發射全部數據,其他Observable將會被忽略。
contains
contains操作符將接收一個特定的值作為一個參數,判定原Observable是否發射該值,若已發射,則創建并返回的Observable將發射true,否則發射false。
判斷在發射的所有數據項中是否包含指定的數據,內部調用的其實是exists
contains操作符默認不在任何特定的調度器上執行。
可用來判斷Observable發射的值中是否包含該值。
exists
exists操作符類似與contains操作符,不同的是,其接受一個函數參數,在函數中,對原Observable發射的數據,設定比對條件并做判斷。若任何一項滿足條件就創建并返回一個發射true的Observable,否則返回一個發射false的Observable。
該操作符默認不在任何特定的調度器上執行。
判斷是否存在數據項滿足某個條件。內部通過OperatorAny實現。
isEmpty
isEmpty操作符用于判定原始Observable是否沒有發射任何數據。若原Observable未發射任何數據,創建創建并返回一個發射true的Observable,否則返回一個發射false的Observable。
isEmpty操作符默認不在任何特定的調度器上執行。
可以用來判斷是否沒有數據發射。
defaultIfEmpty
defaultIfEmpty操作接受一個備用數據,在原Observable沒有發射任何數據正常終止(以onCompletedd的形式),該操作符以備用數據創建一個Observable并將數據發射出去。
RxJava將這個操作符實現為defaultIfEmpty。它默認不在任何特定的調度器上執行。
switchIfEmpty
如果原始Observable正常終止后仍然沒有發射任何數據,就使用備用的Observable。
如果原始Observable正常終止后仍然沒有發射任何數據
defaultIfEmpty使用默認值發射,switchIfEmpty使用默認Observable發射
sequenceEqual
sequenceEqual(Observable,Observable,Func2)變體接收兩個Observable參數和一個函數參數,在函數參數中,可以比較兩個參數是否相同。
該操作符默認不在任何特定的調度器上執行。
用于判斷兩個Observable發射的數據是否相同(數據,發射順序,終止狀態)
skipUntil
skipUntil操作符在觀察者訂閱原Observable時,該操作符將是忽略原Observable的發射的數據,直到第二個Observable發射了一項數據那一刻,它才 開始發射原Observable發射的數據。
該操作符默認不在任何特定的調度器上執行。
skipWhile
skipWhile操作符丟棄原Observable發射的數據,直到發射的數據不滿足一個指定的條件,才開始發射原Observable發射的數據。
在觀察者訂閱原Observable時,skipWhile操作符將忽略原Observable的發射物,直到你指定的某個條件變為false時,它開始發射原Observable發射的數據。
skipWhile操作符默認不在任何特定的調度器上執行。
takeUntil
takeUntil操作符與skipUntil操作符作用相反,當第二個Observable發射了一項數據或者終止時,丟棄原Observable發射的任何數據。
takeUntil(Func1)變體接受一個函數參數,當滿足條件時終止發射數據。
takeWhile
takeWhile操作符與skipWhile操作符作用相反。在觀察者訂閱原Observable時,takeWhile創建并返回原Oservable的鏡像Observable,暫命名為_observable,發射原Observable發射的數據。當你指定的某個條件變為false時,_observable發射onCompleted終止通知。
takeWhile操作符默認不在任何特定的調度器上執行。
變換操作符
map
對被觀察者發送的每1個事件都通過指定的函數處理,從而變換成另外一種事件
即,將被觀察者發送的事件轉換為任意的類型事件。
如果是list,可對list的每個元素進行類型轉換,最后tolist發射轉換后的list。
flatmap
對Observable發射的數據都應用(apply)一個函數,這個函數返回一個Observable,然后合并這些Observables,并且發送(emit)合并的結果。 flatMap和map操作符很相像,flatMap發送的是合并后的Observables,map操作符發送的是應用函數后返回的結果集
將原Observable發射的每個數據轉換為新的Observable,發射每一個轉換的Observable
新合并生成的事件序列順序是無序的,即與舊序列發送事件的順序無關
concatMap
作用同flatMap
與flatMap的區別是,新合并生成的事件序列順序是有序的
switchMap
當源Observable發射一個新的數據項時,如果舊數據項訂閱還未完成,就取消舊訂閱數據和停止監視那個數據項產生的Observable,開始監視新的數據項.
cast
cast操作符將原始Observable發射的每一項數據都強制轉換為一個指定的類型,然后再發射數據,它是map的一個特殊版本
所相互轉換的類之間需要存在某種關系,如繼承、實現
concat
組合多個被觀察者一起發送數據,合并后 按發送順序串行執行
按發送順序串行執行
merge
組合多個被觀察者一起發送數據,合并后 按時間線并行執行
區別上述concat()操作符:同樣是組合多個被觀察者一起發送數據,但concat()操作符合并后是按發送順序串行執行
并行執行
zip
合并多個被觀察者(Observable)發送的事件,生成一個新的事件序列(即組合過后的事件序列),并最終發送
事件組合方式 = 嚴格按照原先事件序列 進行對位合并
最終合并的事件數量 = 多個被觀察者(Observable)中數量最少的數量
reduce
把被觀察者需要發送的事件聚合成1個事件 & 發送
聚合的邏輯根據需求撰寫,但本質都是前2個數據聚合,然后與后1個數據繼續進行聚合,依次類推
自定義聚合條件,前2個數據聚合得到結果與第三個數據再聚合。以此類推...
collect
將被觀察者Observable發送的數據事件收集到一個數據結構里
Observable.just(1, 2, 3, 4)
.collect(new Func0<ArrayList<Integer>>() {
@Override
public ArrayList<Integer> call() {
//創建收集容器
return new ArrayList<>();
}
}, new Action2<ArrayList<Integer>, Integer>() {
@Override
public void call(ArrayList<Integer> list1, Integer integer) {
//開始收集每一項數據
list1.add(integer);
}
}).subscribe(new Action1<ArrayList<Integer>>() {
@Override
public void call(ArrayList<Integer> integers) {
//得到收集后的數據
}
});
startWith
在一個被觀察者發送事件前,追加發送一些數據或是一個新的被觀察者
//源碼是通過concat實現,在前面追加一個Observable
public final Observable<T> startWith(Observable<T> values) {
return concat(values, this);
}
compose
其他操作符
retry
重試,即當出現錯誤時,讓被觀察者(Observable)重新發射數據
retryUntil
出現錯誤后,判斷是否需要重新發送數據
retryWhen
遇到錯誤時,將發生的錯誤傳遞給一個新的被觀察者(Observable),并決定是否需要重新訂閱原始被觀察者(Observable)& 發送事件
repeat
無條件地、重復發送 被觀察者事件
具備重載方法,可設置重復創建次數
repeatWhen
有條件地、重復發送 被觀察者事件
count
統計被觀察者發送事件的數量