1. 概述

有时,在反应式编程中,我们可能会拥有大量项目的发布者。在某些情况下,该发布者的消费者可能无法一次性处理所有项目。因此,我们可能需要异步发布每个项目以匹配消费者的处理速度。

在本教程中,我们将研究一些将 CollectionMono 转换为 CollectionFlux 项目的方法。

2. 问题描述

使用响应式流时,我们使用 Publisher 及其两个实现: FluxMono 。虽然 单声道 是一种 发布者 可以发出 0 或 1 个 T 类型的项目,即 Flux 可以发出 0 到 N 个 T 类型的项目。

假设我们有一个 Mono 发布者,它持有 Mono<List* *>T 类型的项目的可迭代集合。我们的要求是使用 Flux 异步生成集合项:

在这里,我们可以看到我们需要一个 Mono<List* 上的运算符 *> 可以执行此转换。首先,我们将从流发布者 Mono 中提取集合项,然后以 Flux 的 方式异步生成项。

Mono 发布器包含一个可以同步转换 Mono 的 Map 运算符,以及一个用于异步转换 Mono 的 flatMap 运算符 。此外,这两个运算符都会生成单个项目作为输出。

然而, * 对于我们的用例来说,在展平 Mono<List* 后会生成许多项目* **> ,我们可以使用 flatMapManyflatMapIterable *。

让我们探讨一下如何使用这些运算符。

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);
}

flatMapManyMono 上的通用运算符,它返回 Publisher。 让我们将 flatMapMany 应用到我们的解决方案中:

private <T> Flux<T> monoTofluxUsingFlatMapMany(Mono<List<T>> monoList) {
    return monoList
      .flatMapMany(Flux::fromIterable)
      .log();
}

在本例中, flatMapMany 获取 MonoList ,将其展平,并使用 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 获取 MonoList 并将其在内部转换为其元素的 Flux 。因此,与 flatMapMany 运算符相比,它更加优化。 并且这会输出相同的“ ”、“ ”、“ ”、“ ”,然后终止

5. 结论

在本文中,我们讨论了转换 Mono<List 的* 不同方法 *> 进入 助焊剂 使用运算符 flatMapManyflatMapIterable 。两者都是易于使用的运算符。虽然 flatMapMany 对于更通用的发布者很有用,但 flatMapIterable 针对此类目的进行了更好的优化。

与往常一样,代码示例可以在 GitHub 上找到。