如何创建使用缓存值的CompletableFuture?

时间:2018-03-04 19:34:08

标签: java completable-future

我熟悉使用Guava的Suppliers.memoizeWithExpiration()CacheBuilder缓存延迟加载值。

我很难弄清楚如何对异步加载的值进行相同操作(使用CompletableFuture)。

具体来说,我想要一个返回CompletableFuture的机制,如果可用,它将返回一个缓存值;否则,计算并缓存该值。

我担心如果我使用Supplier<CompletableFuture<Integer>> cache = Suppliers.memoize(),那么供应商会缓存CompletableFuture,但消费者每次都会重新运行管道。

我有哪些选择?

1 个答案:

答案 0 :(得分:2)

快速测试消除了我的恐惧:

public final class Testcase
{
    public static void main(String[] args) throws InterruptedException, ExecutionException
    {
        Random random = new Random();
        Supplier<CompletableFuture<Integer>> cache = Suppliers.memoize(() ->
        {
            return CompletableFuture.supplyAsync(() ->
            {
                return random.nextInt();
            });
        });
        for (int i = 0; i < 10; ++i)
            System.out.println(cache.get().get());
    }
}

输出:

1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378
1171697378

现在考虑一下,我意识到Supplier每次都会返回相同的CompletableFuture实例,一旦CompletableFuture完成,它就会保证每次返回相同的值。所以我们很安全。