连锁几个CompletableFuture操作

时间:2019-08-04 14:06:29

标签: java completable-future

我几乎没有想要像在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})

2 个答案:

答案 0 :(得分:1)

使用allOf时,无法围绕输入期货调用join来获取依赖函数中的值(尽管您会知道这些调用不会阻塞)。 / p>

但是,当您恰好有两个期货合并时,则无需使用allOf;您可以将它们平滑组合:

CompletableFuture<FinalResult> f = data1
    .thenCombine(data2, (result1, result2) -> another CompletableFuture)
    .thenCompose(Function.identity())
    .thenAccept(result3 -> …);

thenAccept将评估将结果值映射到新结果值的函数,而thenCompose将评估将结果值映射到新未来的函数。方法thenCombinethenAccept的两步变化,允许将两个值映射到一个新值。

但是thenCombine没有两个未来的变体,因此解决方案是将由两个中间值创建的未来当作一个值(获取未来的未来),然后跟上{{1} }将“价值”映射到未来。然后,一旦将来完成,我们就可以链接一个函数来处理第三个结果。

答案 1 :(得分:0)

CompletableFuture.allOf(...)返回一个library(tidyr) library(dplyr) set.seed(123) name <- sample(letters[1:5], 10, replace = T) level <- sample(1:3, 10, replace = T) month <- sample(1:12, 10, replace = T) df <- data.frame(name, level, month) df %>% group_by(name, month, level) %>% summarise(n = n()) %>% ungroup() %>% spread(., level, n, sep = "_") 。它对givne CompletableFuture<Void>所返回的类型一无所知:

  

给定CompletableFuture的结果(如果有的话)不会反映在返回的CompletableFuture中,但可以通过单独检查获得。

因此,如果要使用CompletableFutureget的返回值,则必须data1