Flux 和 Mono 的區別
1. 概述
在本教程中將瞭解 Reactor Core 庫的 Flux 和 Mono 之間的區別。
2. 什麼是 Mono?
Mono 是一種特殊類型的 Publisher。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 Vs Flux
Mono 和 Flux 都是 Publisher 接口的實現。簡單來說,我們可以說,當我們在做計算或向數據庫或外部服務發出請求,並期望最多一個結果時,我們應該使用 Mono。
當期望從我們的計算、數據庫或外部服務調用中獲得多個結果時,應該使用 Flux。
Mono 有點類似於 Java 中的 Optional 類,因爲它包含 0 或 1 個值;而 Flux 與 List 更相似,因爲它可以有 N 個值。
5. 結論
在本文中瞭解了 Mono 和 Flux 之間的區別。
與往常一樣,示例的完整源代碼可在 GitHub 上獲得。
https://github.com/eugenp/tutorials/tree/master/reactor-core
blog.smart-tools.cn/2022/10/31/java-reactor-flux-vs-mono/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/QoxyPxGcwBrEnl1TpecOZA