当前位置: 首页 > 知识库问答 >
问题:

将可完成功能列表转换为列表的一个可完成未来

傅嘉悦
2023-03-14

我有一个CompletableFuture实例列表。

List<CompletableFuture<String>> listOfFutures;

如何将他们转变成这样一个未来:

CompletableFuture<List<String>> futureOfList = convert(listOfFutures);

共有2个答案

申屠宏胜
2023-03-14

你可以这样做:

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()));
}
吉毅
2023-03-14

这是一元序列运算。用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:函数函数中的非穷尽模式 我知道我得到这个错误,因为列表是不一样的大小,你们怎么认为我可以解决这个问题