我熟悉使用Guava的Suppliers.memoizeWithExpiration()
和CacheBuilder
缓存延迟加载值。
我很难弄清楚如何对异步加载的值执行相同的操作(使用 CompletableFuture )。
具体来说,我想要一个返回 CompletableFuture
的机制如果可用的话,将返回一个缓存值;否则,计算并缓存该值。
恐怕如果我使用 Supplier<CompletableFuture<Integer>> cache = Suppliers.memoize()
那么供应商将缓存CompletableFuture
但消费者每次都会重新运行管道。
我有什么选择?
最佳答案
快速测试消除了我的恐惧:
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
完成,它就会保证每次都返回相同的值。所以我们很安全。
关于java - 如何创建使用缓存值的 CompletableFuture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49099554/