跳到主要内容

我需要哪个操作符?

Doubao 中英对照 Which operator do I need?

目录

提示

在本节中,如果某个操作符为 Flux 或 Mono 所特有,它会相应地加上前缀并附上链接,如下所示:Flux#fromArray。通用操作符没有前缀,并同时提供两个实现的链接,例如:just (Flux|Mono)。当某个特定用例由多个操作符组合实现时,它会以方法调用的形式呈现,带前导点号,参数放在括号中,如下所示:.methodCall(parameter)。

我想要处理:

1. 创建新的序列…​​

2. 转换已有序列​

  • 我想转换已有数据:

    • 一对一地(例如将字符串转换为其长度):map (Flux|Mono)

      • …​仅仅是做类型转换:cast (Flux|Mono)

      • …​为了标出每个源值的索引:Flux#index

    • 一对多地(例如将字符串转换为其字符):flatMap (Flux|Mono) + 使用一个工厂方法

    • 一对多地,并为每个源元素和/或状态提供可编程的行为:handle (Flux|Mono)

    • 为每个源元素运行一个异步任务(例如将 url 转换为 http 请求):flatMap (Flux|Mono) + 一个返回异步 Publisher-的方法

      • …​忽略某些数据:在 flatMap lambda 中有条件地返回 Mono.empty()

      • …​保持原始序列顺序:Flux#flatMapSequential(它会立即触发异步过程,但会对结果重新排序)

      • …​异步任务可返回多个值,源为 Mono:Mono#flatMapMany

  • 我想向已有序列添加预设元素:

  • 我想聚合一个 Flux:(下文省略 Flux# 前缀)

  • 我想组合多个发布者…​

    • 按顺序:Flux#concat 或 .concatWith(other) (Flux|Mono)

    • 按发出顺序(组合的各项随到随发):Flux#merge / .mergeWith(other) (Flux|Mono)

    • 通过配对值:

    • 通过协调它们的终止:

    • 选择第一个…​

      • 产生_值_(onNext)的发布者:firstWithValue (Flux|Mono)

      • 产生_任意信号_的发布者:firstWithSignal (Flux|Mono)

    • 由源序列中的元素触发:switchMap(每个源元素被映射为一个 Publisher)

    • 由一系列发布者中下一个发布者的开始触发:switchOnNext

  • 我想重复一个已有序列:repeat (Flux|Mono)

    • …​但按固定时间间隔:Flux.interval(duration).flatMap(tick → myExistingPublisher)

  • 我有一个空序列,但…​

    • 我想得到一个值代替:defaultIfEmpty (Flux|Mono)

    • 我想改用另一个序列:switchIfEmpty (Flux|Mono)

  • 我有一个序列,但我对值不感兴趣:ignoreElements (Flux.ignoreElements()|Mono.ignoreElement())

  • 我有一个 Mono,想推迟它的完成…​

  • 我想把元素递归地展开为一个序列图,并发出其组合…​

    • …​按广度优先展开图:expand(Function) (Flux|Mono)

    • …​按深度优先展开图:expandDeep(Function) (Flux|Mono)

3. 窥探序列​

4. 过滤序列​

5. 处理错误​

  • 我想创建一个出错序列:error (Flux|Mono)…​

    • …​用来替换一个成功的 Flux 的完成:.concat(Flux.error(e))

    • …​用来替换一个成功的 Mono 的_发出_:.then(Mono.error(e))

    • …​如果 onNext 之间耗时过长:timeout (Flux|Mono)

    • …​惰性地:error(Supplier<Throwable>) (Flux|Mono)

  • 我想要以下 try/catch 的等价物:

    • 抛出:error (Flux|Mono)

    • 捕获异常:

      • 并回退到一个默认值:onErrorReturn (Flux|Mono)

      • 并吞掉错误(即完成):onErrorComplete (Flux|Mono)

      • 并回退到另一个 Flux 或 Mono:onErrorResume (Flux|Mono)

      • 并包装后重新抛出:.onErrorMap(t → new RuntimeException(t)) (Flux|Mono)

    • finally 块:doFinally (Flux|Mono)

    • Java 7 的 using 模式:using (Flux|Mono) 工厂方法

  • 我想从错误中恢复…​

    • 通过回退:

    • 通过重试…​

      • …​使用简单策略(最大尝试次数):retry() (Flux|Mono), retry(long) (Flux|Mono)

      • …​由一个伴随控制 Flux 触发:retryWhen (Flux|Mono)

      • …​使用标准退避策略(带抖动的指数退避):retryWhen(Retry.backoff(…​)) (Flux|Mono)(另见 Retry 中的其他工厂方法)

  • 我想处理背压"错误"(向上游请求最大量,并在下游产生的请求不足时应用策略)…​

6. 与时间打交道​

7. 拆分 Flux​

8. 回到同步世界​

注意:除 Mono#toFuture 之外,所有这些方法如果在标记为"仅非阻塞"的 Scheduler(默认即 parallel() 和 single())中调用,都会抛出 UnsupportedOperatorException。

9. 将 Flux 多播给多个 Subscriber​