Java 反应器-如何避免递归?
使用SpringWebFlux,我希望一个接一个地发送HTTP请求,直到响应满足特定标准。我还需要收集所有回复。在阻塞世界中,解决方案如下: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)
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();
灵感来自