RxJava操作符lift笔记25
在内部,每个Rx operator都做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时所做的那样,有几件事需要考虑:
- 订阅者可以自由取消订阅。不先检查就不要推送:!subscriber.isUnsubscribed()。
- 您有责任遵守Rx协议:任意数量的onNext通知,可选地后跟单个onCompleted或onError。
- 如果需要执行异步操作和调度,请使用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相关推荐
- RxJava操作符serialize 笔记-二十六
如果您不能保证您的operator将遵守 Rx 协议,例如因为您从多个源异步推送,则可以使用serialize运算符.serialize运算符会将不可靠的可观察量转换为合法的,顺序的可观察量. 让我们 ...
- 程序的加载和执行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25
程序的加载和执行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文终于把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...
- JAVA自学笔记25
JAVA自学笔记25 1.GUI 1)图形用户接口,以图形的方式,来显示计算机操作的界面,更方便更直观 2)CLI 命令行用户接口,就是常见的Dos,操作不直观 3) 类Dimension 类内封装单 ...
- RxJava操作符(四)Combining
RxJava操作符(四)Combining 原文链接 http://blog.chinaunix.net/uid-20771867-id-5197584.html 上一篇文章中我们了解了如何对数据进行 ...
- RxJava操作符学习APP
用于学习RxJava操作符的app 下载地址: fir.im http://fir.im/bpdu 或者直接在 Release里面下载 https://github.com/jiang111/RxJa ...
- Rxjava操作符之过滤操作
前言: 本文将介绍以下过滤类操作符(基于Rxjava2.0): filter ofType take takeLast first firstOrError last lastOrError skip ...
- 笔记25 笨办法习题35分支和函数路线图
笔记25 笨办法习题35分支和函数路线图 这似乎是前面ex31游戏的一个延续,这么长的脚本录下来了,用ps执行,很快就纠正若干字码错误,顺利执行完毕.我先试着把这个代码的思路做个整理,理解各个指令的基 ...
- Android RxJava操作符的学习---创建操作符
RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求 1. 简介 RxJava 操作符的具体简介如下: 2. 类型 RxJava功能强大,所以其对应的 ...
- RxJava操作符(三)Filtering
在上一篇文章里,我们了解了转化操作符,能将数据转化为我们想要的格式,但是如果数据集合里面有一些我们想要过滤掉的数据怎么办?这时候我们就需要使用过滤操作符了,有点类似于sql里的where,让Obser ...
最新文章
- 将 CentOS 8 操作系统迁移到 Oracle Linux
- linux nfs如何配置,Linux上的NFS如何配置?
- django配置数据驱动,python安装失败问题
- 浅析透雾监控镜头的四大透雾技术
- 机器学习java_Java机器学习,第2部分
- contains方法_【原创】Pandas数据处理系列(二):常用处理方法笔记
- [HDOJ]1005. Number Sequence
- Hibernate 系列 02 - Hibernate介绍及其环境搭建
- 双缓冲(Double Buffer)原理和使用【转】
- Kali-linux :arping命令
- 状态机编程实例及适用范围
- 亚太区最美面孔杨超越登榜,网友:不喜欢她
- 法国五名酒吧和咖啡馆老板因使用无日志WiFi网络被捕
- 如果你已经厌倦了情人节的玫瑰
- 用Python发一个高逼格的朋友圈【附代码】
- 为什么你应聘不上或试用期被开?
- 致远项目管理SPM系统案例:中关村创客小镇数据采集云管理
- Lenovo系列问题第四期
- HFS命令行客户端_HFClient
- android 三星打印机,安卓逆袭传统 三星X4300LX复合机首测
热门文章
- 轻便的客户端本地文件数据库 SQLite
- [转载] python中的且语句_简单探讨python中的语句和语法
- [转载] Python中pandas dataframe删除一行或一列:drop函数
- [转载] Python中对 Excel 的相关详细操作(读取、写入、指定行、指定列、新增sheet工作表)
- [转载] Python中的数学函数,三角函数,随机数函数
- warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
- 迷人的bug--torch.load
- 代码质量管控的四个阶段
- fshc模块fsch2mcu_if理解
- 关于ASP.NET给产品分类,分页,详情页生成静态页面