1. 概述
有时,在反应式编程中,我们可能会拥有大量项目的发布者。在某些情况下,该发布者的消费者可能无法一次性处理所有项目。因此,我们可能需要异步发布每个项目以匹配消费者的处理速度。
在本教程中,我们将研究一些将 Collection 的 Mono 转换为 Collection 的 Flux 项目的方法。
2. 问题描述
使用响应式流时,我们使用 Publisher 及其两个实现: Flux 和 Mono 。虽然 单声道 是一种 发布者 可以发出 0 或 1 个 T 类型的项目,即 Flux 可以发出 0 到 N 个 T 类型的项目。
假设我们有一个 Mono 发布者,它持有 Mono<List* *> — T 类型的项目的可迭代集合。我们的要求是使用 Flux 异步生成集合项:
在这里,我们可以看到我们需要一个 Mono<List* 上的运算符 *> 可以执行此转换。首先,我们将从流发布者 Mono 中提取集合项,然后以 Flux 的 方式异步生成项。
Mono 发布器包含一个可以同步转换 Mono 的 Map 运算符,以及一个用于异步转换 Mono 的 flatMap 运算符 。此外,这两个运算符都会生成单个项目作为输出。
然而, * 对于我们的用例来说,在展平 Mono<List* 后会生成许多项目* **> ,我们可以使用 flatMapMany 或 flatMapIterable *。
让我们探讨一下如何使用这些运算符。
3. 平面地图Many
让我们从一个示例 字符串 列表 开始来创建我们的 Mono 发布者:
private Mono<List<String>> monoOfList() {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
return Mono.just(list);
}
flatMapMany 是 Mono 上的通用运算符,它返回 Publisher。 让我们将 flatMapMany 应用到我们的解决方案中:
private <T> Flux<T> monoTofluxUsingFlatMapMany(Mono<List<T>> monoList) {
return monoList
.flatMapMany(Flux::fromIterable)
.log();
}
在本例中, flatMapMany 获取 Mono 的 List ,将其展平,并使用 Flux 运算符 fromIterable 创建一个 Flux 发布者 。 我们还在这里使用 log() 来记录生成的每个元素。因此, 这会一一输出“ 一 ”、“ 二 ”、“ 三 ”、“ 四 ”等元素,然后终止 。
4. 扁平化MapIterable
对于相同的 字符串 示例 列表 ,我们现在将探索 flatMapIterable — 一个自定义构建的运算符。
在这里,我们不需要从 List 显式创建 Flux ;我们只需要提供 List 。该运算符隐式地从其元素中创建一个 Flux 。让我们使用 flatMapIterable 作为我们的解决方案:
private <T> Flux<T> monoTofluxUsingFlatMapIterable(Mono<List<T>> monoList) {
return monoList
.flatMapIterable(list -> list)
.log();
}
在这里, flatMapIterable 获取 Mono 的 List 并将其在内部转换为其元素的 Flux 。因此,与 flatMapMany 运算符相比,它更加优化。 并且这会输出相同的“ 一 ”、“ 二 ”、“ 三 ”、“ 四 ”,然后终止 。
5. 结论
在本文中,我们讨论了转换 Mono<List 的* 不同方法 *> 进入 助焊剂 使用运算符 flatMapMany 和 flatMapIterable 。两者都是易于使用的运算符。虽然 flatMapMany 对于更通用的发布者很有用,但 flatMapIterable 针对此类目的进行了更好的优化。
与往常一样,代码示例可以在 GitHub 上找到。