我使用有3种方法的服务(来自库,我无法改变它):
CompletionStage<AData> getAData(int id);
CompletionStage<BData> getBData(int id);
CompletionStage<Path> computePath(int id);
为了我的目的,我应该得到AData和BData,然后根据这个值尝试计算一些Path
,如果我不能这样做 - 使用服务调用
所以我的代码现在看起来像:
CompletionStage<Path> getPath(int id) {
service.getAData(id).thenCombine(service.getBdata(id)), (a, b) ->
{
Path result = computePathLocaly(a, b);
return result != null ?
result :
service.computePath(id).toCompletableFuture().join();
}
}
一切正常,但toCompletableFuture().join()
看起来非常糟糕。
将result
包裹到CompletionStage
并返回CompletionStage<CompletionStage<Path>>
- 更糟糕的是......
我相信它可以更优雅地完成,但我无法理解如何...请帮助。
答案 0 :(得分:2)
您可以使用service.computePath(id)
电话
computePathLocally
来电
CompletionStage<Path> getPath(int id) {
service.getAData(id).thenCombine(service.getBdata(id)), (a, b) ->
return computePathLocally(a, b);
).thenCompose((result) ->
return result != null ?
CompletableFuture.completedFuture(result) :
service.computePath(id);
)
}