为什么 Reactor 3 需要 Mono 类型?

Why is the Mono type needed in Reactor 3?

Reactor 3 有 2 种主要数据类型,它们都是反应流发布者

我理解 Mono 是 0 或 1 个元素的流与 Flux 是 0 或 N 元素的流之间的区别。

既然 Mono 和 Flush 都在实现 org.reactivestreams.Publisher<T> 为什么我们需要这两种类型为什么不对所有东西都使用 Flux?

想想在非响应式世界中会发生什么:我们可以决定将所有函数 return List<T>,即使我们知道它们只会 return 一个元素.示例:

public List<T> findAll()     <-- looks ok

public List<T> findFirst()   <-- seems strange?

public T findFirst()         <-- better now?

那么我们为什么不总是 return List<T>?因为有时我们使用 List<T> 和其他人只是 T 更方便,这样函数的用户更容易理解期望的内容。

现在,如果我们将这些示例转换为反应世界,我们会得到:

public List<T> findAll()   -->   public Flux<T> findAll()

public T findFirst()       -->   public Mono<T> findFirst()

当然,我们总是可以使用 Flux<T>,因为我们总是可以使用 List<T>,但是当有多个项目或只有一个项目时能够区分更方便。