拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 通量和单声道之间的区别

通量和单声道之间的区别

白鹭 - 2022-10-10 2159 0 2

一、概述

在本教程中,我们将了解Reactor Core 库的[Flux](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html)[Mono](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html)之间的区别。

2. 什么是Mono

Mono是一种特殊类型的[Publisher](https://www.reactive-streams.org/reactive-streams-1.0.3-javadoc/org/reactivestreams/Publisher.html)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 个异步序列值。这意味着它可以发出0 到多个值,对于onNext()请求可能是无限值,然后以完成或错误信号终止。

让我们看一个带有完成信号的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.Mono与。Flux

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

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

Mono与Java 中的Optional类更相关,因为它包含0 或1 个值,而FluxList更相关,因为它可以有N 个值。

5. 结论

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


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *