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
有什么讨论的内容,能够加我公众号: