为什么Reactor 3需要单声道类型?

ams*_*ams 1 spring reactive-programming project-reactor reactive-streams spring-webflux

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来做所有事情?

ESa*_*ala 7

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

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

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

public T findFirst()         <-- better now?
Run Code Online (Sandbox Code Playgroud)

那么为什么我们不总是回来List<T>?因为有时我们使用List<T>简单的方法更方便T,这样就更容易让函数的用户理解期望的内容.

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

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

public T findFirst()       -->   public Mono<T> findFirst()
Run Code Online (Sandbox Code Playgroud)

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