11.3.4 对响应类型执行逻辑操作

有时您只需要知道 Mono 或 Flux 发布的条目是否符合某些条件。all()any() 操作将执行这样的逻辑。图 11.21 和 11.22 说明了 all()any() 是如何工作的:

图 11.21 可以对 Flux 进行测试以确保所有消息在所有操作中都满足某些条件。

图 11.22 可以对 Flux 进行测试以确保在任何操作中至少有一条消息满足某些条件。

假设您想知道由 Flux 发布的每个 String 都包含字母 a 或字母 k。下面的测试演示如何使用 all() 检查该条件:

@Test
public void all() {
  Flux<String> animalFlux = Flux.just(
    "aardvark", "elephant", "koala", "eagle", "kangaroo");

  Mono<Boolean> hasAMono = animalFlux.all(a -> a.contains("a"));
  StepVerifier.create(hasAMono)
    .expectNext(true)
    .verifyComplete();

  Mono<Boolean> hasKMono = animalFlux.all(a -> a.contains("k"));
  StepVerifier.create(hasKMono)
    .expectNext(false)
    .verifyComplete();
}

在第一个 StepVerifier 中,检查字母 a。all 操作应用于源 Flux,从而生成 Boolean 类型的 Mono。在本例中,所有的动物名都包含字母 a,因此从产生的 Mono 发出 true。但是在第二个 StepVerifier 中,得到的 Mono 将发出 false,因为并非所有的动物名都包含 k。

与其执行全部满足或完全不满足的检查,不如满足至少有一个条目匹配。在这种情况下,any() 操作就是您所需要的。这个新的测试用例使用 any() 检查字母 tz

@Test
public void any() {
  Flux<String> animalFlux = Flux.just(
    "aardvark", "elephant", "koala", "eagle", "kangaroo");

  Mono<Boolean> hasAMono = animalFlux.any(a -> a.contains("a"));

  StepVerifier.create(hasAMono)
    .expectNext(true)
    .verifyComplete();

  Mono<Boolean> hasZMono = animalFlux.any(a -> a.contains("z"));
  StepVerifier.create(hasZMono)
    .expectNext(false)
    .verifyComplete();
}

在第一个 StepVerifier 中,您会看到生成的 Mono 发出 true,因为至少有一个动物名有字母 t(特别是 elephant)。在第二个 StepVerifier 中,生成的 Mono 发出 false,因为没有一个动物名包含 z

results matching ""

    No results matching ""