Jeśli mają 2 CompletionStages mogę połączyć je z thenCombine
metoda:Jak połączyć 3 lub więcej etapów realizacji?
CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<Combined> combinedCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (aData, bData) -> combine(aData, bData));
Jeśli mam 3 lub więcej CompletionStages mogę zrobić łańcuch thenCombine
metod, ale muszę używać tymczasowych obiektów do przekazania wyników. Na przykład, o to rozwiązanie wykorzystujące Pair
i Triple
z pakietu 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));
Czy istnieje lepszy sposób na połączenie wyników z wielu CompletionStages?
Nie rozumiem, co chce zrobić. Jaka jest twoja metoda "łączenia"? Jaki jest jego cel? Co chcesz zrobić z 'CompletionStage's? Kto jest konsumentem na końcu? Jaki powinien być wynik, jaki otrzymują? –
@SotiriosDelimanolis, "Combine" to funkcja pobierająca 4 parametry i zwracająca 1 typu "Combined". Konsumentem może być na przykład inna funkcja przyjmująca parametr "Połączony" jako parametr i zwracająca inny "CompletionStage", który jest wywoływany za pomocą 'combinedDataCompletionStage.thenCompose (...)'. –