65

根据文档:

Flux 是一个可以发出 0..N 个元素的流:

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

Mono 是 0..1 个元素的流:

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

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

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

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

4

5 回答 5

61

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

将其与“常规”Java 进行比较:您不会将List其用作任何可以返回零或一个结果的方法的返回类型。您将使用Optional它,这可以立即清楚地表明您不会期望多个结果。

于 2017-12-31T07:57:51.773 回答
33

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

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

关系:

  • 如果你连接两个 Mono,你会得到一个 Flux
  • 您可以在 Flux 上调用 single() 以返回 Mono
于 2018-03-24T17:08:20.883 回答
6

这里的文档

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

于 2017-12-27T08:51:57.560 回答
1

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

于 2021-01-22T12:27:28.463 回答
0

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

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

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

于 2022-01-24T12:29:56.490 回答