Если есть 2 CompletionStages, я могу объединить их с методом thenCombine
:
CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<Combined> combinedCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (aData, bData) -> combine(aData, bData));
Если у меня есть 3 или более CompletionStages, я могу создать цепочку методов thenCombine
, но я должен использовать временные объекты для передачи результатов. Например, вот решение, использующее Pair
и Triple
из пакета org.apache.commons.lang3.tuple
:
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));
Есть ли лучший способ комбинировать результаты с несколькими CompletionStages?