我几乎没有想要像在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})
答案 0 :(得分:1)
使用allOf
时,无法围绕输入期货调用join
来获取依赖函数中的值(尽管您会知道这些调用不会阻塞)。 / p>
但是,当您恰好有两个期货合并时,则无需使用allOf
;您可以将它们平滑组合:
CompletableFuture<FinalResult> f = data1
.thenCombine(data2, (result1, result2) -> another CompletableFuture)
.thenCompose(Function.identity())
.thenAccept(result3 -> …);
thenAccept
将评估将结果值映射到新结果值的函数,而thenCompose
将评估将结果值映射到新未来的函数。方法thenCombine
是thenAccept
的两步变化,允许将两个值映射到一个新值。
但是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
中,但可以通过单独检查获得。
因此,如果要使用CompletableFuture
和get
的返回值,则必须data1
。