避免CompletableFuture

时间:2016-11-21 19:58:56

标签: java completable-future

我正在尝试返回将返回亚马逊响应的CompletableFuture。我的代码首先检查响应是否在本地缓存。如果是,则返回响应,否则调用Amazon。 [注意:真实版本也会缓存从亚马逊收到的响应,但由于代码已经相当复杂,我还没有包括在内。]

有没有办法改变我的callAmazon方法的实现(或以其他方式重新组织代码),这样我就不必手动"将响应状态从amazonApi复制到finalResponse

我不想直接返回cacheCheck,因为我不希望来电者{@ 1}}。

complete()

1 个答案:

答案 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);
    });