java 多嵌套 CompletionStage 等同于 "flatMap"?
java multi nested CompletionStage equivalent to "flatMap"?
所以考虑到我有以下示例:
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);
});
}
});
});
我的问题是整个 CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>>
多嵌套 future 类型。是否可以通过在 Scala 中使用 flatMap
之类的方法将其减少到 CompletionStage<Boolean>
或者是否有其他方法可以做到这一点?
是的,您正在寻找 thenCompose(fn)
操作:
Returns a new CompletionStage that, when this stage completes normally, is executed with this stage as the argument to the supplied function.
此方法采用一个函数作为参数,该函数采用此完成阶段和 returns 另一个完成阶段的结果。
因此,您可以拥有以下内容:
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);
});
}
});
});
所以考虑到我有以下示例:
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);
});
}
});
});
我的问题是整个 CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>>
多嵌套 future 类型。是否可以通过在 Scala 中使用 flatMap
之类的方法将其减少到 CompletionStage<Boolean>
或者是否有其他方法可以做到这一点?
是的,您正在寻找 thenCompose(fn)
操作:
Returns a new CompletionStage that, when this stage completes normally, is executed with this stage as the argument to the supplied function.
此方法采用一个函数作为参数,该函数采用此完成阶段和 returns 另一个完成阶段的结果。
因此,您可以拥有以下内容:
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);
});
}
});
});