05-流式操作:使用 Flux 和 Mono 构建响应式数据流(上)

简介: 05-流式操作:使用 Flux 和 Mono 构建响应式数据流

1 通过 Flux 对象创建响应式流

  • 基于各种工厂模式的静态创建方法
  • 编程的方式动态创建 Flux

相对而言,静态方法在使用上都比较简单,但不如动态方法来得灵活。我们来一起看一下。

2 通过静态方法创建 Flux

Reactor 中静态创建 Flux 的方法常见的包括 just()、range()、interval() 以及各种以 from- 为前缀的方法组等。因为 Flux 可以代表 0 个数据,所以也有一些专门用于创建空序列的工具方法。

2.1 just() 方法

我已经在上一讲为你演示过 just() 方法,它可以指定序列中包含的全部元素,创建出来的 Flux 序列在发布这些元素之后会自动结束。一般情况下,在已知元素数量和内容时,使用 just() 方法是创建 Flux 的最简单直接的做法。

示例:

Flux.just("Hello", "World").subscribe(System.out::println);

Hello World

这里我们对 Flux 执行了用于订阅的 subscribe() 方法,并通过使用 Lambda 表达式调用了 System.out.println() 方法,这意味着将结果打印到系统控制台。关于 subscribe() 方法以及对响应式流的订阅过程,我会在本讲后续内容中进一步说明。


fromXXX() 方法组

如果我们已经有了一个数组、一个 Iterable 对象或 Stream 对象,那么就可以通过 Flux 提供的 fromXXX() 方法组来从这些对象中自动创建 Flux,包括 fromArray()、fromIterable() 和 fromStream() 方法。


示例:

Flux.fromArray(new Integer[] {1, 2, 3})
  .subscribe(System.out::println);

执行结果

1
2
3

range() 方法

如果你快速生成一个整数数据流,那么可以采用 range() 方法,该方法允许我们指定目标整数数据流的起始元素以以及所包含的个数,序列中的所有对象类型都是 Integer,这在创建连续的年份信息或序号信息等场景下非常有用。使用 range() 方法创建 Flux 对象的示例代码如下所示。

Flux.range(2020, 5).subscribe(System.out::println);

显然,这段代码会在控制台中打印出 5 行记录,从 2020 开始,到 2024 结束。

interval() 方法

在 Reactor 框架中,interval() 方法可以用来生成从 0 开始递增的 Long 对象的数据序列。通过 interval() 所具备的一组重载方法,我们可以分别指定这个数据序列中第一个元素发布之前的延迟时间,以及每个元素之间的时间间隔。interval() 方法相对复杂,我们先附上它的弹珠图,如下所示。

使用 interval() 方法创建 Flux 示意图(来自 Reactor 官网)

可以看到,上图中每个元素发布时相当于添加了一个定时器的效果。使用 interval() 方法的示例代码如下所示。

Flux.interval(Duration.ofSeconds(2), Duration.ofMillis(200)).subscribe(System.out::println);

这段代码的执行效果相当于在等待 2 秒钟之后,生成一个从 0 开始逐一递增的无界数据序列,每 200 毫秒推送一次数据。

empty()、error() 和 never()

根据上一讲介绍的 Reactor 异步序列的语义,我们可以分别使用 empty()、error() 和 never() 这三个方法类创建一些特殊的数据序列。其中,如果你希望创建一个只包含结束消息的空序列,那么可以使用 empty() 方法,使用示例如下所示。显然,这时候控制台应该没有任何的输出结果

Flux.empty().subscribe(System.out::println);

然后,通过 error() 方法可以创建一个只包含错误消息的序列。如果你不希望所创建的序列不发出任何类似的消息通知,也可以使用 never() 方法实现这一目标。当然,这几个方法都比较少用,通常只用于调试和测试。

小结

不难看出,静态创建 Flux 的方法简单直接,一般用于生成那些事先已经定义好的数据序列。

而如果:

  • 数据序列事先无法确定
  • 或生成过程中包含复杂的业务逻辑

就需要用到动态创建方法。

标。

目录
相关文章
|
4月前
|
传感器 监控 网络协议
WebSocket 实战:构建高效的实时应用
WebSocket 实战:构建高效的实时应用
WebSocket 实战:构建高效的实时应用
|
10月前
|
JSON 前端开发 API
如何使用GraphQL进行前端数据交互
如何使用GraphQL进行前端数据交互
|
7月前
|
Java Spring
05-流式操作:使用 Flux 和 Mono 构建响应式数据流(下)
05-流式操作:使用 Flux 和 Mono 构建响应式数据流
216 0
|
8月前
|
前端开发 JavaScript UED
数据绑定(Data Binding):实现实时数据交互的前端神器
数据绑定是现代前端开发中的一个重要概念,它允许开发人员将数据模型与用户界面保持同步,实现实时的数据交互。在本博客中,我们将深入研究数据绑定的概念、类型和用法,以及为什么它对构建响应式Web应用程序至关重要。
247 0
|
11月前
|
前端开发 JavaScript 搜索推荐
流式服务器端渲染
流式服务器端渲染(Streaming Server-Side Rendering)是一项在Web开发中备受关注的技术,它结合了服务器端渲染(SSR)和流式数据传输的优势。通过将渲染的HTML内容逐步发送给客户端,流式SSR可以显著加快页面加载速度,提供更好的用户体验,并对搜索引擎优化产生积极影响。本篇博文将深入探讨流式SSR的工作原理、优点和缺点,以及适用的场景。此外,我们还将介绍在一些知名项目中如何应用流式SSR技术。无论是初学者还是有经验的开发人员,本篇博文都将帮助你快速掌握流式SSR的概念和应用,为你的Web项目带来更好的性能和用户体验。让我们一起深入研究这一令人兴奋的前端技术吧!
594 0
|
JavaScript 前端开发
三连弹!原生实现异步处理利器 —— Observable
本篇带来用原生实现 Observable,一探内部究竟!!
|
消息中间件 缓存 供应链
“消息驱动、事件驱动、流 ”基础概念解析
本文旨在帮助大家对近期消息领域的高频词“消息驱动(Message-Driven),事件驱动(Event-Driven)和流(Streaming)”有更清晰的了解和认知,其中事件驱动 EDA 作为 Gartner 预测的十大技术趋势之一, EventBridge 作为下一代消息中间件,也是目前的重点方向之一。
274 0
“消息驱动、事件驱动、流 ”基础概念解析
|
存储 前端开发 JavaScript
为什么我使用 Umi 的 model 简易数据流管理插件
Umi 是一款企业级的 React 前端应用框架,云巧产业数字组件中心推荐使用基于 Umi 的 Koi 框架统一前端应用研发流程,支撑前端项目从研发、联调到上线、发布的全流程。 本文假设您正在或计划使用 Umi 或 Koi 作为底层框架支撑前端应用的开发,并且对 Umi 有一定的了解。 ## 数据治理的原则 React 的核心特征是“数据驱动视图”,用公式表达即 `UI = render(d
|
前端开发 数据管理
012 Umi 的数据流最佳实践(1/2) - 页面级的 hooks 数据流
012 Umi 的数据流最佳实践(1/2) - 页面级的 hooks 数据流
480 0
012 Umi 的数据流最佳实践(1/2) - 页面级的 hooks 数据流
|
前端开发
013 Umi 的数据流最佳实践(2/2) - 全局的 hooks 数据流
013 Umi 的数据流最佳实践(2/2) - 全局的 hooks 数据流
805 0
013 Umi 的数据流最佳实践(2/2) - 全局的 hooks 数据流