gpt4 book ai didi

java - Java 中是否有从 List 到 CompletionStage 的转换器?

转载 作者:行者123 更新时间:2023-12-02 01:30:30 25 4
gpt4 key购买 nike

就像这个使用 of 的假设示例一样:

List<CompletionStage<Long>> listOfFutureLongs = getFutureLongs(...)
CompletionStage<List<Long>> futureListOfLongs = CompletionStage.of(listOfFutureLongs)

最佳答案

奇怪的是没有。

CompletableFutureCompletableFuture.allOf,这有点像您想要的,但 CompletionStage 没有类似的函数。

您可以使用CompletionStage.toCompletableFuture来获取Future,也可以编写自己的Future。

不幸的是,无法检查 CompletionStage 来查看它是否已完成,这意味着您无法高效地完成此操作。

此代码位于我的尚未发布(也尚未测试)的开源项目中。请随意使用它:

public static <T> CompletionStage<List<T>> list(List<CompletionStage<T>> list)
{
if (list.size() <= 0)
{
return CompletableFuture.completedFuture(Collections.emptyList());
}
if (list.size() == 1)
{
return list.get(0).thenApply(Collections::singletonList);
}
final AtomicInteger waiters = new AtomicInteger(1);
final List<T> ret = new ArrayList<>(list.size());
final AtomicReference<Throwable> retErr = new AtomicReference<>();
final CompletableFuture<List<T>> retFuture = new CompletableFuture<>();
for (int i = 0; i < list.size(); ++i)
{
ret.add(null);
final int pos = i;
final CompletionStage<T> cs = list.get(i);
if (cs == null)
{
continue;
}
waiters.incrementAndGet();
cs.whenComplete((val, err) -> {
if (err != null)
{
retErr.compareAndSet(null, err);
}
ret.set(pos, val);
_doneListItem(waiters, retFuture, ret, retErr.get());
});
}
_doneListItem(waiters, retFuture, ret, retErr.get());
return retFuture;
}

private static <T> void _doneListItem(AtomicInteger waitCount, CompletableFuture<List<T>> ret, List<T> val, Throwable err)
{
if (waitCount.decrementAndGet() == 0)
{
if (err != null)
{
ret.completeExceptionally(err);
}
else
{
ret.complete(val);
}
}
}

关于java - Java 中是否有从 List<CompletionStage> 到 CompletionStage<List> 的转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56135121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com