RxJava: merge/concat/switch

RxJS: merge/concat/switch/exhaust

RxSwift: merge/concat/switchLatest

merge/concat/switch/switchLatest/exhaust 合并两个或多个源数据流。

Concat VS Merge operator







从示意图中可以看出,这些操作符在合并源数据流时操作有所不同

  • 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)操作符辨析的更多相关文章

  1. ReactiveX 学习笔记(0)学习资源

    ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...

  2. [原创]java WEB学习笔记30:Cookie Demo 之显示最近浏览的记录

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. ReactiveX 学习笔记(9)工具类操作符

    Observable Utility Operators 本文的主题为处理 Observable 的实用工具类操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(六) ...

  4. ReactiveX 学习笔记(8)错误处理和 To 操作符

    Error Handling Operators Operators to Convert Observables 本文的主题为对 Observable 进行错误处理的操作符以及转换 Observab ...

  5. ReactiveX 学习笔记(7)聚合操作符

    Mathematical and Aggregate Operators 本文的主题为处理 Observable 的聚合操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...

  6. ReactiveX 学习笔记(6)条件操作符

    Conditional and Boolean Operators 本文的主题为处理 Observable 的条件和布尔操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...

  7. ReactiveX 学习笔记(3)转换数据流

    Transforming Observables 本文的主题为转换 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(二)Transform ...

  8. ArcGIS API for JavaScript 4.2学习笔记[30] 点和线高程查询(第八章完结)

    终于到最后一篇了,可喜可贺. 本例先说明了如何进行单点的高程差分析,然后说明了道路的起伏分析.前者很直观地比较了两个年份的高程数据之间的差值,体现山区的高程变化(有啥用啊?)后者,一条路上的起点终点起 ...

  9. ReactiveX 学习笔记(12)调度器

    Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...

随机推荐

  1. Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'xxxxx.Controllers.xxxxController'.

    Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activa ...

  2. springboot结合日志门面SLF4j和日志实现Logback的使用

    一.此处主要介绍在springboot工程下如何使用 logback + slf4j  进行日志记录. logback主要包含三个组成部分:Loggers(日志记录器).Appenders(输出目的在 ...

  3. C语言 小球撞击反弹

    计算法(略) #include <stdio.h> #include <stdlib.h> int main() { int x, y, a, resu; scanf(&quo ...

  4. CentOS7安装Prometheus(二进制)

    一.概述 Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本. 环境说 ...

  5. 解决fiddler不能抓取firefox浏览器包的问题(转)

    转自:https://blog.csdn.net/jimmyandrushking/article/details/80819103

  6. NET Core 3.0 AutoFac替换内置DI的新姿势

    原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...

  7. oracle基础知识语法大全

    ORACLE支持五种类型的完整性约束NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.CHECK (检查)--检查在约束中 ...

  8. ABP 结合 MongoDB 集成依赖注入

    1.我们再ABP项目添加一个.NET Core类库  类库名自定定义, 我这里定义为 TexHong_EMWX.MongoDb 添加NuGet包. ABP mongocsharpdriver 添加 A ...

  9. yum -y install java-1.8.0-openjdk-devel.x86_64

    yum -y install java-1.8.0-openjdk-devel.x86_64

  10. 使用 Create-React-App 开发 Chrome 扩展

    整理 Kindle 标注.书签和笔记从未如此简单! Kindle 标注管理应用 Kindle Mate 只支持 Windows,不支持 Mac.标注只是解析我的剪贴文本文件,配合 FileReader ...