1. 概述
在本教程中,我们将了解Reactor Core库中Flux和Mono之间的区别。
2. 什么是Mono?
Mono是一种特殊类型的Publisher,Mono对象表示单个值或空值。这意味着它最多只能为onNext()请求发出一个值,然后以onComplete()信号终止。如果失败,它只会发出一个onError()信号。
让我们看一个带有完成信号的Mono示例:
@Test
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
void givenFluxPublisher_whenSubscribeThenReturnMultipleValues() {
Flux<String> stringFlux = Flux.just("Hello", "Tuyucheng");
StepVerifier.create(stringFlux)
.expectNext("Hello")
.expectNext("Tuyucheng")
.expectComplete()
.verify();
}
现在,让我们看一个带有错误信号的Flux示例:
@Test
void givenFluxPublisher_whenSubscribeThenReturnMultipleValuesWithError() {
Flux<String> stringFlux = Flux.just("Hello", "Tuyucheng", "Error")
.map(str -> {
if (str.equals("Error"))
throw new RuntimeException("Throwing Error");
return str;
});
StepVerifier.create(stringFlux)
.expectNext("Hello")
.expectNext("Tuyucheng")
.expectError()
.verify();
}
我们可以在这里看到,在从Flux中获取两个值后,我们得到了一个错误。
4. Mono与Flux
Mono和Flux都是Publisher接口的实现。简单来说,我们可以说:当我们在做计算或向数据库或外部服务发出请求,并期望得到最多一个结果时,我们应该使用Mono。
当我们期望从计算、数据库或外部服务调用中获得多个结果时,我们应该使用Flux。
Mono与Java中的Optional类更相关,因为它包含0或1个值,而Flux与List更相关,因为它可以有N个值。
5. 总结
在本文中,我们了解了Mono和Flux之间的区别。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章