结合多个阶段并随着阶段数量的不断增加而良好扩展的唯一方法是使用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
方法,你不需要Triple
, a Pair
足够了:
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)))));
它的结构更简单,但仍然不能很好地扩展更多阶段。