Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反应器-如何避免递归?_Java_Spring Webflux_Project Reactor_Spring Webclient - Fatal编程技术网

Java 反应器-如何避免递归?

Java 反应器-如何避免递归?,java,spring-webflux,project-reactor,spring-webclient,Java,Spring Webflux,Project Reactor,Spring Webclient,使用SpringWebFlux,我希望一个接一个地发送HTTP请求,直到响应满足特定标准。我还需要收集所有回复。在阻塞世界中,解决方案如下: List<String> responses = new ArrayList<>(); String lastResponse; do { lastResponse = webClient.get() .uri(uri) .retrieve() .bodyToMono(String.class)

使用SpringWebFlux,我希望一个接一个地发送HTTP请求,直到响应满足特定标准。我还需要收集所有回复。在阻塞世界中,解决方案如下:

List<String> responses = new ArrayList<>();
String lastResponse;
do {
  lastResponse = webClient.get()
    .uri(uri)
    .retrieve()
    .bodyToMono(String.class)
    .block();
  responses.add(lastResponse);
} while(!finished(lastResponse));
List responses=new ArrayList();
字符串响应;
做{
lastResponse=webClient.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class)
.block();
添加(lastResponse);
}而(!finished(lastResponse));
如何在不阻塞的情况下实现这一点

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

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());
    });
}
private List()){
返回webClient.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class)
.flatMap(响应->{
如果(完成(响应)){
返回列表(响应);
}
返回collectRemaining().flatMap(剩余->
Stream.concat(Stream.of(response),remaining.Stream()).collect(Collectors.toList());
});
}

要替换递归,您可以使用运算符,它可以基于上一个元素生成下一个元素。它通常用于实现分页逻辑。因此,类似以下的操作可能会起作用:

webClient.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class)
.展开(响应->{
如果(完成(响应)){
返回Mono.empty();
}
返回webClient.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class);
}).collectList();
灵感来自