响应式流中的Mono与Flux对比

77

根据文档:

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

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

Mono 是一个包含0到1个元素的流:

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

既然两者都是响应式流中的发布者接口的实现,那么在大多数情况下我们不能只使用 Flux 吗?因为它也可以发出 0..1,从而满足 Mono 的条件。

或者说有一些具体的情况,只能使用 Mono,Flux 无法处理这些操作吗?请建议。

5个回答

77

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

与“普通”的Java相比:您不会将List用作可以返回零或一个结果的任何方法的返回类型。相反,您将使用Optional,这使得立即清楚您不希望有多个结果。


37

Flux 是等价于 RxJava Observable 的能够发出:
- 零个或多个项目(多个元素的流)
- 然后可选地完成 或者 失败的工具

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

关系:

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

7

根据此处的文档:

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


1

Mono 用于处理零个或一个结果,而 Flux 用于处理零个到多个结果,甚至可能是无限的结果。两者都表现为纯异步和完全非阻塞。


0

我认为在我们知道只能获得一个结果的情况下使用 Mono 是一个好的实践。这样,我们可以让其他开发人员知道结果可能是 0 或 1。

我们在所有项目中都采用这种方法。

这里有一个关于响应式流和 Mono 和 Flux 的使用的好教程 -> Java 中的响应式编程


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接