原文鏈接:[http://www.lxweimin.com/p/f61a5a988590], 此文為筆記整理,感謝原作者
1.變換操作(Transforming Observables)
buffer
buffer
方法作用是緩沖組合,第一個參數是緩沖時間,第二個參數是緩沖個數,第三個參數是線程。
該方法簡單來說就是緩存Observable
中發出的新元素,當元素達到某個數量,或者經過了特定的時間,它就會將這個元素集合發送出來。window
window
操作符和buffer
十分相似。不過buffer
是周期性的將緩存的元素集合發送出來,而window
周期性的將元素集合以Observable
的形態發送出來。
同時buffer
要等到元素搜集完畢后,才會發出元素序列。而window
可以實時發出元素序列。map
該操作符通過傳入一個函數閉包把原來的Observable
序列轉變為一個新的Observable
序列。flatMap
map
在做轉換的時候容易出現“升維”的情況。即轉變之后,從一個序列變成了一個序列的序列。
而flatMap
操作符會對源Observable
的每一個元素應用一個轉換方法,將他們轉換成Observables
。 然后將這些Observables
的元素合并之后再發送出來。即又將其 "拍扁"(降維)成一個Observable
序列。
這個操作符是非常有用的。比如當Observable
的元素本生擁有其他的Observable
時,我們可以將所有子Observables
的元素發送出來。flatMapLatest
flatMapLatest
與flatMap
的唯一區別是:flatMapLatest
只會接收最新的value
事件。concatMap
concatMap
與flatMap
的唯一區別是:當前一個Observable
元素發送完畢后,后一個Observable
才可以開始發出元素。或者說等待前一個Observable
產生完成事件后,才對后一個Observable
進行訂閱。scan
scan
就是先給一個初始化的數,然后不斷的拿前一個結果和最新的值進行處理操作。groupBy
groupBy
操作符將源Observable
分解為多個子Observable
,然后將這些子Observable
發送出來。
也就是說該操作符會將元素通過某個鍵進行分組,然后將分組后的元素序列以Observable
的形態發送出來。
2.過濾操作符(Filtering Observables)
filter
該操作符就是用來過濾掉某些不符合要求的事件。distinctUntilChanged
該操作符用于過濾掉連續重復的事件。single
限制只發送一次事件,或者滿足條件的第一個事件。
如果存在有多個事件或者沒有事件都會發出一個 error 事件。
如果只有一個事件,則不會發出 error事件。elementAt
該方法實現只處理在指定位置的事件。ignoreElements
該操作符可以忽略掉所有的元素,只發出error
或completed
事件。
如果我們并不關心Observable
的任何元素,只想知道Observable
在什么時候終止,那就可以使用ignoreElements
操作符。take
該方法實現僅發送Observable
序列中的前 n 個事件,在滿足數量之后會自動.completed
。takeLast
該方法實現僅發送Observable
序列中的后 n 個事件。skip
該方法用于跳過源Observable
序列發出的前 n 個事件。Sample
Sample
除了訂閱源Observable
外,還可以監視另外一個Observable
, 即notifier
。
每當收到notifier
事件,就會從源序列取一個最新的事件并發送。而如果兩次notifier
事件之間沒有源序列的事件,則不發送值。debounce
debounce
操作符可以用來過濾掉高頻產生的元素,它只會發出這種元素:該元素產生后,一段時間內沒有新元素產生。
換句話說就是,隊列中的元素如果和下一個元素的間隔小于了指定的時間間隔,那么這個元素將被過濾掉。
debounce
常用在用戶輸入的時候,不需要每個字母敲進去都發送一個事件,而是稍等一下取最后一個事件。
3.條件和布爾操作符(Conditional and Boolean Operators)
amb
當傳入多個Observables
到amb
操作符時,它將取第一個發出元素或產生事件的Observable
,然后只發出它的元素。并忽略掉其他的Observables
。takeWhile
該方法依次判斷Observable
序列的每一個值是否滿足給定的條件。 當第一個不滿足條件的值出現時,它便自動完成。takeUntil
除了訂閱源Observable
外,通過takeUntil
方法我們還可以監視另外一個Observable
, 即notifier
。
如果notifier
發出值或complete
通知,那么源Observable
便自動完成,停止發送事件skipWhile
該方法用于跳過前面所有滿足條件的事件。
一旦遇到不滿足條件的事件,之后就不會再跳過了。skipUntil
同上面的takeUntil
一樣,skipUntil
除了訂閱源Observable
外,通過skipUntil
方法我們還可以監視另外一個Observable
, 即notifier
。
與takeUntil
相反的是。源Observable
序列事件默認會一直跳過,直到notifier
發出值或complete
通知。
4.結合操作(Combining Observables)
startWith
該方法會在Observable
序列開始之前插入一些事件元素。即發出事件消息之前,會先發出這些預先插入的事件消息。merge
該方法可以將多個(兩個或兩個以上的)Observable
序列合并成一個Observable
序列zip
該方法可以將多個(兩個或兩個以上的)Observable
序列壓縮成一個Observable
序列。
而且它會等到每個Observable
事件一一對應地湊齊之后再合并。combineLatest
該方法同樣是將多個(兩個或兩個以上的)Observable
序列元素進行合并。
但與zip
不同的是,每當任意一個Observable
有新的事件發出時,它會將每個Observable
序列的最新的一個事件元素進行合并。withLatestFrom
該方法將兩個Observable
序列合并為一個。每當self
隊列發射一個元素時,便從第二個序列中取出最新的一個值。switchLatest
switchLatest
有點像其他語言的switch
方法,可以對事件流進行轉換。
比如本來監聽的subject1
,我可以通過更改variable
里面的value
更換事件源。變成監聽subject2
。
5.算數、以及聚合操作(Mathematical and Aggregate Operators)
toArray
該操作符先把一個序列轉成一個數組,并作為一個單一的事件發送,然后結束。reduce
reduce
接受一個初始值,和一個操作符號。
reduce
將給定的初始值,與序列里的每個值進行累計運算。得到一個最終結果,并將其作為單個值發送出去。concat
concat
會把多個Observable
序列合并(串聯)為一個Observable
序列。
并且只有當前面一個Observable
序列發出了completed
事件,才會開始發送下一個Observable
序列事件。
6.連接操作(Connectable Observable Operators)
可連接的序列和一般序列不同在于:有訂閱時不會立刻開始發送事件消息,只有當調用 connect()
之后才會開始發送值。
可連接的序列可以讓所有的訂閱者訂閱后,才開始發出事件消息,從而保證我們想要的所有訂閱者都能接收到事件消息。
publish
publish
方法會將一個正常的序列轉換成一個可連接的序列。同時該序列不會立刻發送事件,只有在調用connect
之后才會開始。replay
replay
同上面的publish
方法相同之處在于:會將將一個正常的序列轉換成一個可連接的序列。同時該序列不會立刻發送事件,只有在調用connect
之后才會開始。
replay
與publish
不同在于:新的訂閱者還能接收到訂閱之前的事件消息(數量由設置的bufferSize
決定)。multicast
multicast
方法同樣是將一個正常的序列轉換成一個可連接的序列。
同時multicast
方法還可以傳入一個Subject
,每當序列發送事件時都會觸發這個Subject
的發送。refCount
refCount
操作符可以將可被連接的Observable
轉換為普通Observable
即該操作符可以自動連接和斷開可連接的Observable
。當第一個觀察者對可連接的Observable
訂閱時,那么底層的Observable
將被自動連接。當最后一個觀察者離開時,那么底層的Observable
將被自動斷開連接。share(relay:)
該操作符將使得觀察者共享源Observable
,并且緩存最新的n
個元素,將這些元素直接發送給新的觀察者。
簡單來說shareReplay
就是replay
和refCount
的組合。
6.其他實用的操作符(Observable Utility Operators)
delay
該操作符會將Observable
的所有元素都先拖延一段設定好的時間,然后才將它們發送出來。delaySubscription
使用該操作符可以進行延時訂閱。即經過所設定的時間后,才對Observable
進行訂閱操作。materialize
該操作符可以將序列產生的事件,轉換成元素。
通常一個有限的Observable
將產生零個或者多個onNext
事件,最后產生一個onCompleted
或者onError
事件。而materialize
操作符會將Observable
產生的這些事件全部轉換成元素,然后發送出來。dematerialize
該操作符的作用和materialize
正好相反,它可以將materialize
轉換后的元素還原。timeout
使用該操作符可以設置一個超時時間。如果源Observable
在規定時間內沒有發任何出元素,就產生一個超時的error
事件。using
使用using
操作符創建Observable
時,同時會創建一個可被清除的資源,一旦Observable
終止了,那么這個資源就會被清除掉了。