【问题标题】:Why is the Mono type needed in Reactor 3?为什么 Reactor 3 需要 Mono 类型?
【发布时间】:2018-06-18 17:14:52
【问题描述】:
Reactor 3 有 2 种主要数据类型,它们都是反应式流发布者
reactor.core.publisher.Mono<T>
reactor.core.publisher.Flux<T>
我理解 Mono 是 0 或 1 个元素的流与 Flux 是 0 或 N 个元素的流之间的区别。
既然 Mono 和 Flush 都在实现 org.reactivestreams.Publisher<T>,为什么我们需要这两种类型,为什么不把 Flux 用于一切?
【问题讨论】:
标签:
spring
reactive-programming
project-reactor
spring-webflux
reactive-streams
【解决方案1】:
想想在非响应式世界中发生了什么:我们可以决定让所有函数都返回List<T>,即使我们知道它们只会返回一个元素。示例:
public List<T> findAll() <-- looks ok
public List<T> findFirst() <-- seems strange?
public T findFirst() <-- better now?
那么为什么我们不总是返回List<T>?因为有时我们使用List<T> 和其他人只使用T 更方便,这样函数的用户更容易理解预期的内容。
现在,如果我们将这些示例转换为响应式世界,我们会得到:
public List<T> findAll() --> public Flux<T> findAll()
public T findFirst() --> public Mono<T> findFirst()
当然,我们总是可以使用Flux<T>,就像我们总是可以使用List<T>一样,但是当有多个项目或只有一个项目时能够区分会更方便。