1. 概述

在这个教程中,我们将了解Reactor Core库中的FluxMono之间的区别。

2. 什么是Mono

MonoPublisher(发布者)[^1]的一种特殊类型。一个Mono对象表示单个或空值。这意味着对于onNext()请求,它最多只能发出一个值,然后通过onComplete()信号完成。如果发生错误,它只会发出一个onError()信号。

让我们看一个带有完成信号的Mono示例:

@Test
public void givenMonoPublisher_whenSubscribeThenReturnSingleValue() {
    Mono<String> helloMono = Mono.just("Hello");
    StepVerifier.create(helloMono)
      .expectNext("Hello")
      .expectComplete()
      .verify();
}

这里我们可以看到,当订阅helloMono时,它只发出一个值,然后发送完成信号。

3. 什么是Flux

Flux是标准的Publisher,代表0到N个异步序列值。这意味着它可以为onNext()请求发出0到多个值,甚至可能是无限值,然后以完成或错误信号结束。

下面是带有完成信号的Flux示例:

@Test
public void givenFluxPublisher_whenSubscribedThenReturnMultipleValues() {
    Flux<String> stringFlux = Flux.just("Hello", "Baeldung");
    StepVerifier.create(stringFlux)
      .expectNext("Hello")
      .expectNext("Baeldung")
      .expectComplete()
      .verify();
}

现在,我们来看一个带有错误信号的Flux示例:

@Test
public void givenFluxPublisher_whenSubscribeThenReturnMultipleValuesWithError() {
    Flux<String> stringFlux = Flux.just("Hello", "Baeldung", "Error")
      .map(str -> {
          if (str.equals("Error"))
              throw new RuntimeException("Throwing Error");
          return str;
      });
    StepVerifier.create(stringFlux)
      .expectNext("Hello")
      .expectNext("Baeldung")
      .expectError()
      .verify();
}

可以看到,从Flux获取两个值后,我们收到了一个错误。

4. MonoFlux的区别

MonoFlux都是Publisher接口的实现。简单来说,当我们进行某种计算或向数据库或外部服务发出请求,并期望最多得到一个结果时,应使用Mono

当我们期望从计算、数据库查询或外部服务调用中获取多个结果时,应使用Flux

Mono更类似于Java中的Optional类,因为它包含0或1个值,而Flux更类似于List,因为它可以有任意数量的值。

5. 总结

在本文中,我们了解了MonoFlux的区别。

如往常一样,示例的完整源代码可在GitHub上找到:https://github.com/eugenp/tutorials/tree/master/reactor-core

[^1]: Publisher在Reactor Core中是用于处理异步数据流的抽象概念,类似于Java中的流(Stream)。