反应流中的 Mono 与 Flux

Mono vs Flux in Reactive Stream

根据文档:

Flux is a stream which can emit 0..N elements:

Flux<String> fl = Flux.just("a", "b", "c");

Mono is a stream of 0..1 elements:

Mono<String> mn = Mono.just("hello");

并且两者都是反应流中 Publisher 接口的实现。

我们不能在大多数情况下只使用Flux吗,因为它也可以发射0..1,从而满足Mono的条件?

或者有一些特定的情况只需要使用Mono而Flux无法处理这些操作? 请建议。

来自文档 here

这种区别将一些语义信息带入类型,表明异步处理的粗略基数。例如,一个 HTTP 请求只产生一个响应,因此进行计数操作没有多大意义。因此,将此类 HTTP 调用的结果表示为 Mono 比将其表示为 Flux 更有意义,因为它仅提供与零项或一项上下文相关的运算符。

在许多情况下,您正在进行一些计算或调用服务,并且您期望只有一个结果(或者可能是零个或一个结果),而不是可能包含多个结果的集合。在这种情况下,使用 Mono.

会更方便

将其与 "regular" Java 进行比较:您不会使用 List 作为任何可以 return 零或一个结果的方法的 return 类型.您可以改用 Optional,这样可以立即清楚地表明您期望的结果不会超过一个。

Flux 等同于 RxJava Observable 能够发射
- 零个或多个项目(许多元素的流)
- 然后 OPTIONALLY ,完成 OR 失败

Mono 最多只能发出一项(流出一个元素)

关系:

  • 如果您连接两个 Monos,您将得到一个 Flux
  • 您可以在 Flux 上调用 single() 以 return 一个 Mono

就像 Mono 用于处理零个或一个结果一样,而 Flux 用于处理零到多个结果,甚至可能是无限个结果。 两者的共同点是纯异步和完全非阻塞。

我认为在我们知道只能得到一个结果的情况下使用 Mono 是一种很好的做法。通过这种方式,我们让从事相同工作的其他开发人员知道结果可以是 0 或 1。

我们在所有项目中都遵循这种方法。

这是一篇关于 Reactive Streams 以及 Mono 和 Flux 的使用的好教程 -> Reactive programming in Java