首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reactor -如何避免递归?

Reactor -如何避免递归?
EN

Stack Overflow用户
提问于 2021-02-10 17:11:07
回答 1查看 120关注 0票数 0

使用spring,我想逐个发送WebFlux请求,直到响应满足特定的标准。我还需要收集所有的回复。在阻塞世界中,解决方案是这样的:

代码语言:javascript
复制
List<String> responses = new ArrayList<>();
String lastResponse;
do {
  lastResponse = webClient.get()
    .uri(uri)
    .retrieve()
    .bodyToMono(String.class)
    .block();
  responses.add(lastResponse);
} while(!finished(lastResponse));

如何在不阻塞的情况下实现这一点?

注意:有一个简单的递归解决方案,但我正在寻找一种更优雅的方法:

代码语言:javascript
复制
private List<String> collectRemaining() {
  return webClient.get()
    .uri(uri)
    .retrieve()
    .bodyToMono(String.class)
    .flatMap(response -> {
      if(finished(response)) {
        return List.of(response);
      }
      return collectRemaining().flatMap(remaining ->
          Stream.concat(Stream.of(response), remaining.stream()).collect(Collectors.toList());
    });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-11 04:04:55

要替换递归,您可以使用expand()运算符,这使得可以根据前一个元素生成下一个元素。它通常用于实现分页逻辑。因此,下面这样的代码可能会起作用:

代码语言:javascript
复制
webClient.get()
        .uri(uri)
        .retrieve()
        .bodyToMono(String.class)
        .expand(response -> {
            if (finished(response)) {
                return Mono.empty();
            }
            return webClient.get()
                    .uri(uri)
                    .retrieve()
                    .bodyToMono(String.class);
        }).collectList();

灵感来自this article

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66133897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档