Java 多嵌套 CompletionStage 相当于 "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>>>>多嵌套未来类型。有没有可能通过在Scala中使用类似flatMap的东西将其简化为CompletionStage<Boolean>,或者有其他方法可以做到这一点?

是的,您正在寻找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);
            });
        }
    });
});