我正在尝试返回将返回亚马逊响应的CompletableFuture
。我的代码首先检查响应是否在本地缓存。如果是,则返回响应,否则调用Amazon。 [注意:真实版本也会缓存从亚马逊收到的响应,但由于代码已经相当复杂,我还没有包括在内。]
有没有办法改变我的callAmazon
方法的实现(或以其他方式重新组织代码),这样我就不必手动"将响应状态从amazonApi
复制到finalResponse
?
我不想直接返回cacheCheck
,因为我不希望来电者{@ 1}}。
complete()
答案 0 :(得分:1)
使您的要求如此复杂的原因是cacheCheck
可以抛出异常。
在您的情况下,我要做的是重构缓存,以便在缓存中找不到值null
,或者如果值在缓存中,则提供实际Response
。
此外,我会修改callAmazon
以直接返回CompletableFuture
:
private CompletableFuture<Response> callAmazon() {
CompletableFuture<Response> amazonApi = //...
return amazonApi;
}
这样您就可以使用thenCompose:
final CompletableFuture<Response> cacheCheck = //...
final CompletableFuture<Response> amazonResponse = callAmazon();
final CompletableFuture<Response> finalResult =
cachedResponse.thenCompose(cacheResult -> {
return cacheResult == null ? amazonResponse : CompletableFuture.completedFuture(cacheResult);
});
如果确实需要从缓存中抛出异常,可以使用exceptionally将异常转换为空值,然后使用thenCompose来决定是否使用缓存价值,或致电亚马逊:
final CompletableFuture<Response> finalResult = cachedResponse.exceptionally(e -> {
return null;
}).thenCompose(cacheResult -> {
return cacheResult == null ? amazonResponse : CompletableFuture.completedFuture(cacheResult);
});