一、概述
在本教程中,我们将了解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
Mono
和Flux
都是Publisher
接口的实现。简单来说,我们可以说,当我们在做计算或向数据库或外部服务发出请求,并期望最多一个结果时,我们应该使用Mono
。
当我们期望从我们的计算、数据库或外部服务调用中获得多个结果时,我们应该使用Flux
。
Mono
与Java 中的Optional
类更相关,因为它包含0 或1 个值,而Flux
与List
更相关,因为它可以有N 个值。
5. 结论
在本文中,我们了解了Mono
和Flux
之间的区别。
0 评论