我有一个CompletableFuture
实例列表。
List<CompletableFuture<String>> listOfFutures;
如何将他们转变成这样一个未来:
CompletableFuture<List<String>> futureOfList = convert(listOfFutures);
你可以这样做:
public static <T> CompletableFuture<List<T>> convert(List<CompletableFuture<T>> futures) {
return futures.stream().
map(f -> f.thenApply(Stream::of)).
reduce((a, b) -> a.thenCompose(xs -> b.thenApply(ys -> concat(xs, ys)))).
map(f -> f.thenApply(s -> s.collect(toList()))).
orElse(completedFuture(emptyList()));
}
这是一元序列运算。用cyclops-monad-api(我写的一个库)你可以写
AnyM<Stream<String>> futureStream = AnyMonads.sequence(
AsAnyMList.completableFutureToAnyMList(futures));
CompletableFuture<Stream<String>> futureOfList = futureStream.unwrap();
当您在FutureOfList内的Stream上调用终端操作时,例如转换为List,它将触发对所有原始期货的连接()调用,因此应该以类似的方式使用连接()本身。
CompletableFuture<List<String>> completed = futureOfList.thenApply(
s->s.collect(Collectors.toList());
要专门为CompletableFuture编写自己的版本,您可以这样做
CompletableFuture<Stream<String>> futureOfList = CompletableFuture.completedFuture(1)
.thenCompose(one->listOfFutures.stream()
.map(cf->cf.join()));
然后加入
CompletableFuture<List<String>> completed = futureOfList.thenApply(
s->s.collect(Collectors.toList());
另请参阅此问题和答案,了解使用 allOf 的解决方案(不会阻塞任何其他线程)。
我要做的是异步计算树结构的深度,我将有树的第一层,我想启动一个异步线程来分别计算每个节点的深度。 在计算过程中,树中显然可能有一个分叉,在这一点上,我想踢一个额外的线程来计算那个分支。 我已经得到了这个工作,但我需要做一些整理逻辑,当所有这些未来完成。但我对这一过程中产生的额外的可完成的未来感到困扰。 我会用什么方法来保存所有开始的CompletableFutures+那些动态创建的,并且在执行任
我正在尝试转换
我以前有个可打电话的课 我曾经使用提交。如何更改为使用
如果我对如何使用RxJava2缺乏基本的了解,请提前道歉,因为在我看来,这应该是非常基本的东西。我已经因为不成功的Google搜索而绞尽脑汁,所以欢迎任何资源推荐。为了清晰起见,我选择使用解决方法代码的“净化”表示。 我有一个RxJava2函数,它返回一个
TL;DR:我希望能够等待所有的期货,但是一旦它结束,就得到每个可赎回的返回值。 假设我使用一个执行器运行多个Callable。如果我有一个未来列表,是否有任何优雅的方法可以获得任何已完成任务的回报值,然后以相同的方式等待任务的其余部分?
我正在尝试将列表的元组转换为列表,但是我没有成功,所以我有了这个函数 获取输入,例如: ( [1,2,3,4], [7,8,9] ) 并应返回: [1,7,2,8,3,9,4] 我有 结果是: [1,7,2,8,3,9***异常:hw2.hs:29: 1-54:函数函数中的非穷尽模式 我知道我得到这个错误,因为列表是不一样的大小,你们怎么认为我可以解决这个问题