Cab*_*ero 9 java future completable-future
所以考虑我有以下例子:
CompletionStage<String> tokenFuture = getToken();
CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>> result = tokenFuture.thenApply(token -> {
WSRequest request = ws.url(url).setHeader("Authorization", "Bearer " + token);
CompletionStage<WSResponse> response = request.post(json);
return response.thenApply(r -> {
if (r.getStatus() == 201) {
return CompletableFuture.supplyAsync(() -> CompletableFuture.supplyAsync(() -> true));
} else {
return getToken().thenApply(t -> {
WSRequest req = ws.url(url).setHeader("Authorization", "Bearer " + t);
return req.post(json).thenApply(b -> b.getStatus() == 201);
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
我的问题是整个CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>>多嵌套的未来类型.是否有可能CompletionStage<Boolean>通过使用像flatMapScala之类的东西来减少它,还是有其他方法可以做到这一点?
Tun*_*aki 15
是的,您正在寻找thenCompose(fn)操作:
返回一个新的CompletionStage,当此阶段正常完成时,将使用此阶段作为所提供函数的参数执行.
此方法将函数作为参数,该参数获取此完成阶段的结果并返回另一个完成阶段.
因此,您可以拥有以下内容:
CompletionStage<String> tokenFuture = getToken();
CompletionStage<Boolean> result = tokenFuture.thenCompose(token -> {
WSRequest request = ws.url(url).setHeader("Authorization", "Bearer " + token);
CompletionStage<WSResponse> response = request.post(json);
return response.thenCompose(r -> {
if (r.getStatus() == 201) {
return CompletableFuture.supplyAsync(() -> true);
} else {
return getToken().thenCompose(t -> {
WSRequest req = ws.url(url).setHeader("Authorization", "Bearer " + t);
return req.post(json).thenApply(b -> b.getStatus() == 201);
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2068 次 |
| 最近记录: |