Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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多嵌套CompletionStage相当于;平面地图;?_Java_Future_Completable Future - Fatal编程技术网

java多嵌套CompletionStage相当于;平面地图;?

java多嵌套CompletionStage相当于;平面地图;?,java,future,completable-future,Java,Future,Completable Future,因此,考虑到以下示例: CompletionStage<String> tokenFuture = getToken(); CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>> result = tokenFuture.thenApply(token -> { WSRequest request = ws.url(url)

因此,考虑到以下示例:

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-tokenFuture=getToken();
CompletionStage结果=令牌未来。然后应用(令牌->{
WSRequest-request=ws.url(url.setHeader)(“授权”、“承载者”+令牌);
CompletionStage响应=request.post(json);
返回响应。然后应用(r->{
if(r.getStatus()==201){
返回CompletableFuture.supplyAsync(()->CompletableFuture.supplyAsync(()->true));
}否则{
返回getToken()。然后应用(t->{
WSRequest req=ws.url(url.setHeader)(“授权”、“承载者”+t);
返回req.post(json),然后应用(b->b.getStatus()==201);
});
}
});
});

我的问题是整个
CompletionStage
multi-nestedfuture类型。是否可以通过在Scala中使用类似于
flatMap
的东西将其简化为
CompletionStage
,或者是否有其他方法可以做到这一点?

是的,您正在寻找操作:

返回一个新的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);
            });
        }
    });

});
CompletionStage-tokenFuture=getToken();
CompletionStage结果=令牌未来。然后合成(令牌->{
WSRequest-request=ws.url(url.setHeader)(“授权”、“承载者”+令牌);
CompletionStage响应=request.post(json);
返回响应。然后组合(r->{
if(r.getStatus()==201){
返回CompletableFuture.SupplySync(()->true);
}否则{
返回getToken()。然后组合(t->{
WSRequest req=ws.url(url.setHeader)(“授权”、“承载者”+t);
返回req.post(json),然后应用(b->b.getStatus()==201);
});
}
});
});

应该注意的是,对于Play框架(这是本代码的目的),在注意正确的执行上下文的同时,应该使用
thencomposasync()