java - Flux 为空时的last()操作

标签 java spring-webflux

当我需要获取通量的最后一个元素(最后一个方法)时,我试图解决我的问题,但在某些情况下这些通量可能为空并且出现以下错误

Flux#last() didn't observe any onNext signal

这是我的链条

return apiService.getAll(entry)
      .flatMap(response -> {
          if (response.getId() != null){
             //do some logic
             return Mono.just("some Mono");
          }
          else{
             return Mono.empty();
             }
          })
          .last()
          //more flatMap operators

我也已经使用了 switchIfEmpty() 但无法修复。 验证是否可以调用last()或跳过并返回空以终止链操作的正确实现是什么。

谢谢

最佳答案

根据Flux.last() API 文档:

emit NoSuchElementException error if the source was empty. For a passive version use takeLast(int)

这意味着,对于空的上游 Flux:

  • last() 将发出错误
  • takeLast(1) 将返回一个空通量

现在,takeLast(1) 返回一个 Flux,而不是像 last() 那样返回一个 Mono。然后,您可以将其与 Flux.next() 链接起来,它将返回唯一保留的值(如果有),或传播空信号。

注意:另一种解决方案是使用 last().onErrorResume(NoSuchElementException.class, err -> Mono.empty())。 这将捕获由 last() 内部发送的错误,然后返回一个空的单声道。 但是,如果除了 last() 之外还有一些可能引发 NoSuchElementException 的代码,您可能会错过问题。为此,我个人对您的情况的选择是使用 takeLast(1).next()

以下代码示例显示了 last() 与 takeLast(1).next() 的行为:

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class FluxLast {

    static void subscribe(Mono<?> publisher) {
        publisher.subscribe(value -> {},
                            err -> System.out.println("Failed: " + err.getMessage()),
                            () -> System.out.println("Completed empty"));
    }
    
    public static void main(String[] args) {
        subscribe(Flux.empty().last());
        subscribe(Flux.empty().takeLast(1).next());

        // When not empty, takeLast(1).next() will return the last value
        Integer v = Flux.just(1, 2, 3)
                            .takeLast(1)
                            .next()
                            .block();
        System.out.println("Last value: "+v);
    }
}

程序输出:

Failed: Flux#last() didn't observe any onNext signal from Callable flux
Completed empty
3

关于java - Flux 为空时的last()操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75259348/

相关文章:

java - 如何在 spring 中以 react 方式提供文件/PDF 文件

java - Spring Security - 无法使用自定义登录页面登录

java - 有没有办法开始有目的地在 Spotify 上播放音乐?

java - 抽象类上的 EJB 注入(inject)

spring-boot - Webclient 在 Docker 中泄漏内存?

java - 可以通过指标 :9443 port 访问 8080 端口中的 Spring WebFlux 端点

java - JSON 应该如何存储如下值

java - Maven - 如何对依赖于另一个项目的项目进行单元测试?

spring - Spring Cloud Gateway全局异常处理/记录

spring-webflux - Spring Web Flux 和 Reactor 中的 Map 与 FlatMap