我熟悉使用Guava的Suppliers.memoizeWithExpiration()
和CacheBuilder
缓存延迟加载值。
我很难弄清楚如何对异步加载的值进行相同操作(使用CompletableFuture)。
具体来说,我想要一个返回CompletableFuture
的机制,如果可用,它将返回一个缓存值;否则,计算并缓存该值。
我担心如果我使用Supplier<CompletableFuture<Integer>> cache = Suppliers.memoize()
,那么供应商会缓存CompletableFuture
,但消费者每次都会重新运行管道。
我有哪些选择?
答案 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
完成,它就会保证每次返回相同的值。所以我们很安全。