Reactor 操作符

上篇文章我们将 Flux 和 Mono 的操作符分了 11 类,我们来继续学习转换类操作符的第 2 篇。

转换类操作符

转换类的操作符数量最多,平常过程中也是使用最频繁的。

Flux#concatMap

将响应式流中元素顺序转换为目标类型的响应式流,之后再将这些流连接起来。该方法提供了 2 个重载方法,传递的第 2 个参数为内部生成响应式流的预取数量。见图知意:

Flux.range(3, 8)
.concatMap(n -> Flux.just(n - 10, n, n + 10), 3)
.subscribe(System.out::println);

Flux#concatMapDelayError

concatMapDelayError 和 concatMap 区别在于,当内部生成响应式流发出 error 时,是否延迟响应 error 。该方法提供了 3 个重载方法,支持传递参数:是否延迟发出错误和预取数量。

Flux.range(3, 8)
.concatMapDelayError(n -> {
if (n == 4) {
return Flux.error(new NullPointerException());
}
return Flux.just(n - 10, n, n + 10);
})
.subscribe(System.out::println, System.err::println);

Flux#concatIterable

concatIterable 和 concatMap 的区别在于 内部返回的类型不同,一个为 Iterable, 一个为 响应式流。见图知意:

Flux.range(3, 8)
.publishOn(Schedulers.single())
.concatMapIterable(n -> {
if (n == 4) {
throw new NullPointerException();
}
return Arrays.asList(n - 10, n, n + 10);
})
.onErrorContinue((e, n) -> System.err.println("数据:" + n + ",发生错误:" + e))
.subscribe(System.out::println);

elapsed

收集响应式流中元素的间隔发出时间,转换为 时间间隔 和 旧元素 组成的 Tuple2 的响应式流。见图知意:

Flux.interval(Duration.ofMillis(300))
.take(20)
.elapsed(Schedulers.parallel())
.subscribe(System.out::println);
Thread.sleep(7000);

expand

从上层节点逐层展开方式递归展开树形节点。

Flux.just(16, 18, 20)
.expand(n -> {
if (n % 2 == 0) {
return Flux.just(n / 2);
} else {
return Flux.empty();
}
})
.subscribe(System.out::println);

expandDeep

从上层节点逐个展开方式递归展开树形节点。expand 和 expandDeep 的区别在于展开方式不同,另外它俩都提供了 capacityHint 指定递归时初始化容器的容量。

Flux.just(16, 18, 20)
.expandDeep(n -> {
if (n % 2 == 0) {
return Flux.just(n / 2);
} else {
return Flux.empty();
}
})
.subscribe(System.out::println);

总结

本篇我们介绍了 Reactor 部分的转换类操作符,讲解示例时都是单个操作符,相信大家都能理解。

由于最近学习时间不确定,内容比较少。无论工作还是生活的困难,我们只要坚持,终将会被克服解决。今天的内容就学到这里,我们下篇继续学习 Reactor 的操作符。

源码详见:https://github.com/crystalxmumu/spring-web-flux-study-note 下 02-reactor-core-learning

模块下 ReactorTransformOperator02Test 测试类。

学习响应式编程 Reactor (5) - reactor 转换类操作符(2)的更多相关文章

  1. 学习响应式编程 Reactor (4) - reactor 转换类操作符(1)

    Reactor 操作符 数据在响应式流中的处理,就像流过一条装配流水线.Reactor 既是传送带,又是一个个的装配工或机器人.原材料从源头(最初的 Publisher )流出,经过一个个的装配线中装 ...

  2. 学习响应式编程 Reactor (1) - 响应式编程

    响应式编程 命令式编程(Imperative Programing),是一种描述计算机所需做出的行为的编程范式.详细的命令机器怎么(How)去处理以达到想要的结果(What). 声明式编程(Decla ...

  3. 学习响应式编程 Reactor (2) - 初识 reactor

    Reactor Reactor 是用于 Java 的异步非阻塞响应式编程框架,同时具备背压控制的能力.它与 Java 8 函数式 Api 直接集成,比如 分为CompletableFuture.Str ...

  4. 学习响应式编程 Reactor (3) - reactor 基础

    Reactor Reactor 项目的主要 artifact 是 reactor-core,这是一个基于 Java 8 的实现了响应式流规范的响应式库. Reactor 提供了实现 Publisher ...

  5. 响应式编程简介之:Reactor

    目录 简介 Reactor简介 reactive programming的发展史 Iterable-Iterator 和Publisher-Subscriber的区别 为什么要使用异步reactive ...

  6. 响应式编程系列(一):什么是响应式编程?reactor入门

    响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响 ...

  7. Project Reactor 响应式编程

    目录 一. 什么是响应式编程? 二. Project Reactor介绍 三. Reactor核心概念 Flux 1. just() 2. fromArray(),fromIterable()和 fr ...

  8. SpringBoot 2.x (14):WebFlux响应式编程

    响应式编程生活案例: 传统形式: 一群人去餐厅吃饭,顾客1找服务员点餐,服务员把订单交给后台厨师,然后服务员等待, 当后台厨师做好饭,交给服务员,经过服务员再交给顾客1,依此类推,该服务员再招待顾客2 ...

  9. 响应式编程(Reactive Programming)(Rx)介绍

    很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...

随机推荐

  1. upload

    File saveDir=new File("D:/Test/UPLOAD"); if(!saveDir.isDirectory()){ saveDir.mkdirs(); } F ...

  2. Postman中如何实现接口之间的关联?

    Postman中如何实现接口之间的关联? 不单单说Postman中,我为什么拿Postman举例,因为它比较简单一点. 那如果我只问你如何实现接口之间的关联,那肯定有很多的方式,Postman只是其中 ...

  3. 多线程-4.wait() notify() notifyAll() 生产者消费者模型

    1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...

  4. 19.Quick QML-GroupBox自定义

    GroupBox用来将子类的部件显示在其边框内部,并且一般默认左上有一个标题.GroupBox不提供自己的布局.所以需要我们自己通过ColumnLayout或者其他布局方式来进行布局.GroupBox ...

  5. github图文入门教程

    目录 1.注册,安装git 2.初始化git 3.git本地仓库结构 4.初始化第一个git仓库 5.远程仓库的修改 6.总结 1.注册,安装git ①.注册一个github账号 并建立一个仓库 ②. ...

  6. Java学习之jackson篇

    Java学习之jackson篇 0x00 前言 本篇内容比较简单,简单记录. 0x01 Json 概述 概述:JSON(JavaScript Object Notation, JS 对象简谱) 是一种 ...

  7. [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]

    [MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...

  8. 『动善时』JMeter基础 — 20、JMeter配置元件【HTTP Cookie管理器】详细介绍

    目录 1.HTTP Cookie管理器介绍 2.HTTP Cookie管理器界面详解 3.JMeter中对Cookie的管理 (1)Cookie的存储 (2)Cookie的管理策略 4.补充:Cook ...

  9. .NET平台系列10 .NET统一平台愿景

    系列目录     [已更新最新开发文章,点击查看详细] 2019年,微软分享了[统一的.NET堆栈和生态系统的愿景].给开发者带来的价值是,将能够使用一组API,语言和工具来针对广泛的应用程序类型,包 ...

  10. Docker------阿里云部署私有镜像仓库

    Docker------阿里云部署私有镜像仓库   前言 公共镜像仓库 官方:https://hub.docker.com/ 基于各个软件开发或者软件提供方开发的 非官方:其它组织或公司开发的镜像,供 ...