gpt4 book ai didi

java - 如何组合 3 个或更多 CompletionStages?

转载 作者:太空狗 更新时间:2023-10-29 22:31:49 25 4
gpt4 key购买 nike

如果有 2 个 CompletionStages,我可以将它们与 thenCombine 方法结合起来:

CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<Combined> combinedCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (aData, bData) -> combine(aData, bData));

如果我有 3 个或更多 CompletionStage,我可以创建一个 thenCombine 方法链,但我必须使用临时对象来传递结果。例如,这是一个使用 org.apache.commons.lang3.tuple 包中的 PairTriple 的解决方案:

CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<C> cCompletionStage = getC();
CompletionStage<D> dCompletionStage = getD();

CompletionStage<Combined> combinedDataCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (Pair::of))
.thenCombine(cCompletionStage, (ab, c) ->
Triple.of(ab.getLeft(), ab.getRight(), c))
.thenCombine(dCompletionStage, (abc, d) ->
combine(abc.getLeft(), abc.getMiddle(), abc.getRight(), d));

是否有更好的方法来合并来自多个 CompletionStage 的结果?

最佳答案

结合多个阶段并随着阶段数量的增加而扩展的唯一方法是使用 CompletableFuture。如果您的 CompletionStage 不是 CompletableFuture,您仍然可以使用 .toCompletableFuture() 转换它们:

CompletableFuture<A> aCompletionStage = getA().toCompletableFuture();
CompletableFuture<B> bCompletionStage = getB().toCompletableFuture();
CompletableFuture<C> cCompletionStage = getC().toCompletableFuture();
CompletableFuture<D> dCompletionStage = getD().toCompletableFuture();

CompletionStage<Combined> combinedDataCompletionStage = CompletableFuture.allOf(
aCompletionStage, bCompletionStage, cCompletionStage, dCompletionStage)
.thenApply(ignoredVoid -> combine(
aCompletionStage.join(), bCompletionStage.join(),
cCompletionStage.join(), dCompletionStage.join()) );

这包含比通过 thenCombine 组合两个阶段更多的样板文件,但在向其添加更多阶段时样板文件不会增加。


请注意,即使使用原始的 thenCombine 方法,您也不需要 TriplePair 就足够了:

CompletionStage<Combined> combinedDataCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (Pair::of)).thenCombine(
cCompletionStage.thenCombine(dCompletionStage, Pair::of),
(ab, cd) -> combine(ab.getLeft(), ab.getRight(), cd.getLeft(), cd.getRight()));

不过,如果您想组合更多阶段,它的扩展性并不好。


中间解决方案(关于复杂性)可能是:

CompletionStage<Combined> combinedDataCompletionStage = aCompletionStage.thenCompose(
a -> bCompletionStage.thenCompose(b -> cCompletionStage.thenCompose(
c -> dCompletionStage.thenApply(d -> combine(a, b, c, d)))));

它的结构更简单,但仍然不能很好地扩展到更多的阶段。

关于java - 如何组合 3 个或更多 CompletionStages?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34004802/

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