Rx經過連接它們而不是嵌套它們,具備應用運算符的特定樣式。此樣式並不罕見,這對於不可變對象更有意義,甚至能夠在標準Java特性中找到它,例如字符串:String s = new String(「Hi」).toLowerCase().replace('a','c');此樣式容許您按照應用順序查看修改,而且在使用大量運算符時它也看起來更整潔。java
理想狀況下,您但願您的Rx運算符與其餘運算符同樣適合鏈:ios
許多語言都有支持這種方法的方法。不方便的是,Java沒有。您必須編輯Observable自己才能添加本身的方法。沒有必要要求RxJava團隊將您的想法添加到操做集中,由於已經有這麼多,RxJava團隊對於添加另外一個操做符是保守的。你能夠擴展Observable並在那裏添加你本身的運算符。在這種狀況下,您將沒法再共享和組合運算符庫。git
有一種方法可使用compose方法將自定義操做符擬合到鏈中。github
啊哈!Transformer(變形金剛)接口!Transformer <T,R>實際上只是Func1 <Observable <T>,Observable <R >>接口的別名。這是一個採用Observable <T>並返回Observable <R>的方法,就像咱們爲計算運行平均值所作的那樣。函數
Java不容許您僅經過名稱引用函數,所以咱們假設自定義運算符在咱們的Main類中。咱們能夠看到,如今咱們的操做徹底適合鏈條,儘管首先調用compose的樣板。爲了更好的封裝,您應該在一個新類中實現Observable.Transformer,並將整個實現與其輔助類一塊兒移出視線。orm
咱們就像這樣使用它對象
大多數Rx運算符都是可參數化的。咱們也能夠這樣作。讓咱們擴展運算符的功能,能夠忽略超過某個閾值的值。blog
咱們剛剛將參數做爲字段添加到運算符中,爲咱們覆蓋的用途添加了構造函數,並在咱們的Rx操做中使用了該參數。如今咱們能夠作source.compose(new RunningAverage(5)),理想狀況下,咱們將調用source.runningAverage(5)。Rx是一個功能範例,但Java仍然主要是面向對象的語言,而且至關保守。接口
您能夠在此處獲取此示例運算符的完整示例(here)。字符串
下節再續!
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/7.%20Custom%20operators.md
有什麼討論的內容,能夠加我公衆號: