RxJava操做符lift 筆記<二十五>

在內部,每一個Rx operator都作3件事:ios

  1. 它訂閱源並觀察值。
  2. 它根據操做員的目的轉換觀察到的序列。
  3. 它經過調用onNext,onError和onCompleted將修改後的序列推送到本身的訂閱者。

compose運算符使用一種方法,使一個可觀察的方法脫離另外一個方法。這樣作能夠省去手動執行上述3個步驟的麻煩:中間訂閱和推送隱含在Rx鏈中。這假設您可使用現有運算符進行轉換。若是運算符尚不存在,則須要以傳統的Java OOP方式進行處理。這意味着從管道中提取值並在處理時從新推送。執行此操做的Observable.Transformer將包括對源Observable的顯式訂閱和/或顯式建立要返回的新Observable。git

你會發現這一般只是樣板,而且你能夠經過下降級別來避免一些問題。lift operator與compose的不一樣之處在於轉換Subscriber而不是Observable。github

public final <R> Observable<R> lift(Observable.Operator<? extends R,? super T> lift)異步

而且Observable.Operator <R,T>是Func1<Subscriber<? super R>的別名,Subscriber<? super T>>:將Subscriber <R>轉換爲Subscriber <T>的函數。經過直接與訂閱者交易,咱們避免涉及Observable。訂閱和建立Observable類型的樣板將由lift處理。函數

在下一個示例中,咱們將從新實現map,而不使用現有實現或任何其餘現有運算符。測試

Map運算符須要一個將項從T轉換爲R的函數。在咱們的實現中,這是變換器字段。關鍵部分是call方法。咱們收到一個想要接收R類型項的訂閱者<R>。對於該訂閱者,咱們建立一個新Subscriber<T>,它接收類型爲T的項目,將它們轉換爲R類型並將它們推送到Subscriber<R>。lift處理接收Subscriber <R>的樣板,以及使用建立的Subscriber <T>訂閱源observable。日誌

使用Observable.Operator就像使用Observable.Transformer同樣簡單:orm

日誌輸出:blog

Java中的類構造函數不能使用其類型參數。合乎邏輯的最後一步是建立一個能夠爲咱們推斷類型的方法it

並使用這樣的

當手動推送給訂閱者時,就像咱們在實現Observable.Operator時所作的那樣,有幾件事須要考慮:

  1. 訂閱者能夠自由取消訂閱。不先檢查就不要推送:!subscriber.isUnsubscribed()。
  2. 您有責任遵照Rx協議:任意數量的onNext通知,可選地後跟單個onCompleted或onError。
  3. 若是須要執行異步操做和調度,請使用Rx的調度程序。這將使您的operator變得可測試。

下節再續!

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/7.%20Custom%20operators.md#lift

有什麼討論的內容,能夠加我公衆號:

相關文章
相關標籤/搜索