通量和單聲道之間的區別
一、概述
在本教程中,我們將了解 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
之間的區別。
與往常一樣,示例的完整源代碼可在 GitHub 上獲得。