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