在内部,每个Rx operator都做3件事:

  1. 它订阅源并观察值。
  2. 它根据操作员的目的转换观察到的序列。
  3. 它通过调用onNext,onError和onCompleted将修改后的序列推送到自己的订阅者。

compose运算符使用一种方法,使一个可观察的方法脱离另一个方法。这样做可以省去手动执行上述3个步骤的麻烦:中间订阅和推送隐含在Rx链中。这假设您可以使用现有运算符进行转换。如果运算符尚不存在,则需要以传统的Java OOP方式进行处理。这意味着从管道中提取值并在处理时重新推送。执行此操作的Observable.Transformer将包括对源Observable的显式订阅和/或显式创建要返回的新Observable。

你会发现这通常只是样板,并且你可以通过降低级别来避免一些问题。lift operator与compose的不同之处在于转换Subscriber而不是Observable。

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一样简单:

日志输出:

Java中的类构造函数不能使用其类型参数。合乎逻辑的最后一步是创建一个可以为我们推断类型的方法

并使用这样的

当手动推送给订阅者时,就像我们在实现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

有什么讨论的内容,可以加我公众号:

RxJava操作符lift笔记25相关推荐

  1. RxJava操作符serialize 笔记-二十六

    如果您不能保证您的operator将遵守 Rx 协议,例如因为您从多个源异步推送,则可以使用serialize运算符.serialize运算符会将不可靠的可观察量转换为合法的,顺序的可观察量. 让我们 ...

  2. 程序的加载和执行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

    程序的加载和执行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文终于把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...

  3. JAVA自学笔记25

    JAVA自学笔记25 1.GUI 1)图形用户接口,以图形的方式,来显示计算机操作的界面,更方便更直观 2)CLI 命令行用户接口,就是常见的Dos,操作不直观 3) 类Dimension 类内封装单 ...

  4. RxJava操作符(四)Combining

    RxJava操作符(四)Combining 原文链接 http://blog.chinaunix.net/uid-20771867-id-5197584.html 上一篇文章中我们了解了如何对数据进行 ...

  5. RxJava操作符学习APP

    用于学习RxJava操作符的app 下载地址: fir.im http://fir.im/bpdu 或者直接在 Release里面下载 https://github.com/jiang111/RxJa ...

  6. Rxjava操作符之过滤操作

    前言: 本文将介绍以下过滤类操作符(基于Rxjava2.0): filter ofType take takeLast first firstOrError last lastOrError skip ...

  7. 笔记25 笨办法习题35分支和函数路线图

    笔记25 笨办法习题35分支和函数路线图 这似乎是前面ex31游戏的一个延续,这么长的脚本录下来了,用ps执行,很快就纠正若干字码错误,顺利执行完毕.我先试着把这个代码的思路做个整理,理解各个指令的基 ...

  8. Android RxJava操作符的学习---创建操作符

    RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求 1. 简介 RxJava 操作符的具体简介如下: 2. 类型 RxJava功能强大,所以其对应的 ...

  9. RxJava操作符(三)Filtering

    在上一篇文章里,我们了解了转化操作符,能将数据转化为我们想要的格式,但是如果数据集合里面有一些我们想要过滤掉的数据怎么办?这时候我们就需要使用过滤操作符了,有点类似于sql里的where,让Obser ...

最新文章

  1. 将 CentOS 8 操作系统迁移到 Oracle Linux
  2. linux nfs如何配置,Linux上的NFS如何配置?
  3. django配置数据驱动,python安装失败问题
  4. 浅析透雾监控镜头的四大透雾技术
  5. 机器学习java_Java机器学习,第2部分
  6. contains方法_【原创】Pandas数据处理系列(二):常用处理方法笔记
  7. [HDOJ]1005. Number Sequence
  8. Hibernate 系列 02 - Hibernate介绍及其环境搭建
  9. 双缓冲(Double Buffer)原理和使用【转】
  10. Kali-linux :arping命令
  11. 状态机编程实例及适用范围
  12. 亚太区最美面孔杨超越登榜,网友:不喜欢她
  13. 法国五名酒吧和咖啡馆老板因使用无日志WiFi网络被捕
  14. 如果你已经厌倦了情人节的玫瑰
  15. 用Python发一个高逼格的朋友圈【附代码】
  16. 为什么你应聘不上或试用期被开?
  17. 致远项目管理SPM系统案例:中关村创客小镇数据采集云管理
  18. Lenovo系列问题第四期
  19. HFS命令行客户端_HFClient
  20. android 三星打印机,安卓逆袭传统 三星X4300LX复合机首测

热门文章

  1. 轻便的客户端本地文件数据库 SQLite
  2. [转载] python中的且语句_简单探讨python中的语句和语法
  3. [转载] Python中pandas dataframe删除一行或一列:drop函数
  4. [转载] Python中对 Excel 的相关详细操作(读取、写入、指定行、指定列、新增sheet工作表)
  5. [转载] Python中的数学函数,三角函数,随机数函数
  6. warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
  7. 迷人的bug--torch.load
  8. 代码质量管控的四个阶段
  9. fshc模块fsch2mcu_if理解
  10. 关于ASP.NET给产品分类,分页,详情页生成静态页面