我想以与JS中Promises
相同的样式链接多个单独的操作。
所以目前我有这样的代码:
CompletableFuture<Data1> data1 = ...;
CompletableFuture<Data2> data2 = ...;
// Fetch in parallel!
CompletableFuture.allOf(
data1,
data2
).join(); // wait 2 threads to finish
CompletableFuture<Data3> data3 = ... // i need data1 here
data3.join();
是否可以将其重写为一个链?
有点儿:
CompletableFuture.allOf(
data1,
data2
)
.then((result1, result2) -> return another CompletableFuture)
.then(result3 -> { ...do other stuff here})
最佳答案
使用allOf
时,无法在输入期货上调用join
来获取依赖函数中的值(尽管您会知道这些调用不会阻塞)。
但是,当您恰好有两个期货要组合时,就不需要使用allOf
了。您可以将它们顺利组合:
CompletableFuture<FinalResult> f = data1
.thenCombine(data2, (result1, result2) -> another CompletableFuture)
.thenCompose(Function.identity())
.thenAccept(result3 -> …);
thenAccept
将评估将结果值映射到新结果值的函数,而thenCompose
将评估将结果值映射到新future的函数。方法thenCombine
是thenAccept
的两个用途,允许将两个值映射到新值。但是
thenCombine
并没有两个未来的变体,因此解决方案是将由两个中间值创建的未来当作一个值对待(获取未来的未来),然后使用thenCompose(Function.identity())
映射“值”走向未来。然后,一旦将来完成,我们就可以链接一个函数来处理第三个结果。