ReactiveX 学习笔记(30)操作符辨析
RxJava: merge/concat/switch
RxJS: merge/concat/switch/exhaust
RxSwift: merge/concat/switchLatest
merge/concat/switch/switchLatest/exhaust 合并两个或多个源数据流。




从示意图中可以看出,这些操作符在合并源数据流时操作有所不同
- merge 无视各个源数据流整体的发送顺序,只按照合并后各个数据的发送顺序来发送数据。
- concat 严格按照各个源数据流整体的发送顺序来发送数据,即首先发送第一个源数据流中的所有数据,然后再发送第二个源数据流中的所有数据,以此类推。
- switch/switchLatest 兼顾各个源数据流整体的发送顺序以及合并后各个数据的发送顺序,即首先发送第一个源数据流中的数据,等到第二个源数据流开始发送数据再转向发送后者中的数据,以此类推。
与 concat 有所不同的是,在发送前一个数据流中数据的途中,如果接收到后一个数据流中的数据,那么 switch/switchLatest 会抛弃前一个数据流中所有余下的数据,转而发送后一个数据流中的数据。 - exhaust 兼顾各个源数据流整体的发送顺序以及合并后各个数据的发送顺序,即首先发送第一个源数据流中的所有数据,然后再发送第二个源数据流在前者发送完毕之后才开始发送的所有余下的数据,以此类推。
与 concat 有所不同的是,在前一个数据流中数据发送完毕后,exhaust 会忽略后一个数据流在此时间点之前已经发送的数据,只发送后一个数据流在此时间点之后发送的数据。
RxJava: flatMap/concatMap/switchMap
RxJS: mergeMap/concatMap/switchMap/exhaustMap
RxSwift: flatMap/concatMap/flatMapLatest
flatMap/mergeMap/concatMap/switchMap/flatMapLatest/exhaustMap 转换数据流:将源数据流的每一项都转换成数据流,从而形成数据流的数据流,最后再平坦化将两维数据流合并成一个数据流。
RxJava: FlatMap, SwitchMap and ConcatMap differences & examples




从示意图中可以看出,这些操作符在合并由源数据流中的数据所生成的各个目标数据流时操作有所不同
- flatMap/mergeMap 无视源数据流中数据的发送顺序,只按照各个目标数据流中数据的发送顺序来发送数据。
flatMap/mergeMap 在合并目标数据流时使用 merge 操作符 - concatMap 严格按照源数据流中数据的发送顺序来发送各个目标数据流中的数据。
即首先发送源数据流第一项数据所生成的目标数据流中的所有数据,然后再发送源数据流第二项数据所生成的目标数据流中的所有数据,以此类推。
concatMap 在合并目标数据流时使用 concat 操作符 - switchMap/flatMapLatest 兼顾源数据流中数据的发送顺序和各个目标数据流中数据的发送顺序,即首先发送源数据流第一项数据所生成的目标数据流中的数据,等到源数据流第二项数据所生成的目标数据流开始发送数据时再转向发送后者中的数据,以此类推。
与 concatMap 有所不同的是,在发送源数据流前一项数据所生成数据的途中,如果接收到源数据流后一项数据所生成的数据,那么 switchMap/flatMapLatest 会抛弃源数据流前一项数据所生成的所有余下数据,转而发送源数据流后一项数据所生成的数据。
switchMap/flatMapLatest 在合并目标数据流时使用 switch 操作符 - exhaustMap 兼顾源数据流中数据的发送顺序和各个目标数据流中数据的发送顺序,即首先发送源数据流第一项数据所生成的目标数据流中的所有数据,然后再发送源数据流第二项数据所生成的目标数据流在前者发送完毕之后所发送的所有余下的数据,以此类推。
与 concatMap 有所不同的是,在源数据流前一项数据所生成的数据发送完毕之后,exhaustMap 会忽略在此时间点之前源数据流后一项数据所生成的数据,只发送源数据流后一项数据在此时间点之后所生成的所有余下数据。
exhaustMap 在合并目标数据流时使用 exhaust 操作符
val items = listOf("a", "b", "c", "d", "e", "f")
val scheduler = TestScheduler()
items.toObservable()
.flatMap { s ->
val delay = Random().nextInt(10)
Observable.just(s + "x")
.delay(delay.toLong(), TimeUnit.SECONDS, scheduler)
}.toList()
.doAfterSuccess { println(it) }
.subscribe()
scheduler.advanceTimeBy(1, TimeUnit.MINUTES)
/*
[dx, ex, bx, cx, fx, ax]
*/
val items = listOf("a", "b", "c", "d", "e", "f")
val scheduler = TestScheduler()
items.toObservable()
.concatMap { s ->
val delay = Random().nextInt(10)
Observable.just(s + "x")
.delay(delay.toLong(), TimeUnit.SECONDS, scheduler)
}.toList()
.doAfterSuccess { println(it) }
.subscribe()
scheduler.advanceTimeBy(1, TimeUnit.MINUTES)
/*
[ax, bx, cx, dx, ex, fx]
*/
val items = listOf("a", "b", "c", "d", "e", "f")
val scheduler = TestScheduler()
items.toObservable()
.switchMap { s ->
val delay = Random().nextInt(10)
Observable.just(s + "x")
.delay(delay.toLong(), TimeUnit.SECONDS, scheduler)
}.toList()
.doAfterSuccess { println(it) }
.subscribe()
scheduler.advanceTimeBy(1, TimeUnit.MINUTES)
/*
[fx]
*/
Rx.NET: ManySelect/SelectMany
ManySelect 转换数据流:为源数据流的每一项数据都生成一个新的数据流(该数据流为源数据流中的当前数据以及之后发送的所有数据),形成数据流的数据流。
SelectMany 转换数据流:将源数据流的每一项都转换成数据流,从而形成数据流的数据流,最后再平坦化将两维数据流合并成一个数据流。
What does the new ManySelect operator do?


Observable.Range(1, 10).ManySelect(xs => xs.Sum(), Scheduler.CurrentThread).Concat().Dump("ManySelect");
/*
ManySelect-->55
ManySelect-->54
ManySelect-->52
ManySelect-->49
ManySelect-->45
ManySelect-->40
ManySelect-->34
ManySelect-->27
ManySelect-->19
ManySelect-->10
ManySelect completed
*/
Observable.Range(1, 10).SelectMany(x => Observable.Range(x, 10 - x + 1).Sum()).Dump("SelectMany");
/*
SelectMany-->55
SelectMany-->54
SelectMany-->52
SelectMany-->49
SelectMany-->45
SelectMany-->40
SelectMany-->34
SelectMany-->27
SelectMany-->19
SelectMany-->10
SelectMany completed
*/
ReactiveX 学习笔记(30)操作符辨析的更多相关文章
- ReactiveX 学习笔记(0)学习资源
ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...
- [原创]java WEB学习笔记30:Cookie Demo 之显示最近浏览的记录
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- ReactiveX 学习笔记(9)工具类操作符
Observable Utility Operators 本文的主题为处理 Observable 的实用工具类操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(六) ...
- ReactiveX 学习笔记(8)错误处理和 To 操作符
Error Handling Operators Operators to Convert Observables 本文的主题为对 Observable 进行错误处理的操作符以及转换 Observab ...
- ReactiveX 学习笔记(7)聚合操作符
Mathematical and Aggregate Operators 本文的主题为处理 Observable 的聚合操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...
- ReactiveX 学习笔记(6)条件操作符
Conditional and Boolean Operators 本文的主题为处理 Observable 的条件和布尔操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...
- ReactiveX 学习笔记(3)转换数据流
Transforming Observables 本文的主题为转换 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(二)Transform ...
- ArcGIS API for JavaScript 4.2学习笔记[30] 点和线高程查询(第八章完结)
终于到最后一篇了,可喜可贺. 本例先说明了如何进行单点的高程差分析,然后说明了道路的起伏分析.前者很直观地比较了两个年份的高程数据之间的差值,体现山区的高程变化(有啥用啊?)后者,一条路上的起点终点起 ...
- ReactiveX 学习笔记(12)调度器
Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...
随机推荐
- Angular 使用 ng2-file-upload 上传文件遇到的问题
Angular 上传文件 可参考Angular2使用ng2-file-upload上传文件 这里记录在开发过程中遇到的问题: 删除选择的文件后,不能再选择上次选择的相同的文件 在 firefox 浏览 ...
- [转帖]BurpSuite简介
BurpSuite简介 https://bbs.ichunqiu.com/thread-54760-1-1.html BurpSuite ,这是一个辅助渗透的工具,可以给我们带来许多便利.Burp 给 ...
- Flutter 增加三方库卡在flutter package get 的解决办法
修改 pubspec.yaml 文件增加第三方库之后,AndroidStudio 像往常一样提示 需要 package get. 然后一直卡在 Running "flutter packag ...
- 使用PHP开发HR系统(3)
本节我们讲述如何创建主页. ====================================================================================== ...
- HBase 系列(三)—— HBase 基本环境搭建
一.安装前置条件说明 1.1 JDK版本说明 HBase 需要依赖 JDK 环境,同时 HBase 2.0+ 以上版本不再支持 JDK 1.7 ,需要安装 JDK 1.8+ .JDK 安装方式见本仓库 ...
- java中常见关键字的介绍
Java中类,属性,方法修饰符 public 公共访问权限,不但在本应用中可以放问,其他应用也可以访问.接口中的方法默认都是public的 protected 被protected修改的:可以被本类, ...
- 如何获取图片上传OSS后的缩略图 超简单
OSS是使用通过URL尾部的参数指定图片的缩放大小 图片路径后面拼接如下路径: ?x-oss-process=image/[处理类型],x_100,y_50[宽高等参数] ?x-oss-pro ...
- Hadoop1.X集群完全分布式模式环境部署
Hadoop1.X集群完全分布式模式环境部署 1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS,Hadoop Distri ...
- 一个多进程爬虫下载图片的demo
import os,re import pickle import requests import random import time from bs4 import BeautifulSoup f ...
- NSMutableArray 删除可变数组元素
平时使用 NSMutableArray 中经常用到遍历删除数组元素的问题.一般第一个想法是使用一下 forin 就解决了,但是老司机都会知道使用 forin 做删除操作的时候会 crash.报错的原因 ...