Se avere 2 CompletionStages io possa combinare con thenCombine
metodo:Come combinare 3 o più livelli di completamento?
CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<Combined> combinedCompletionStage =
aCompletionStage.thenCombine(bCompletionStage, (aData, bData) -> combine(aData, bData));
Se ho 3 o più CompletionStages posso fare una catena di thenCombine
metodi, ma devo usare oggetti temporanei per passare risultati. Ad esempio, ecco una soluzione utilizzando Pair
e Triple
dal pacchetto 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));
C'è un modo migliore per combinare i risultati provenienti da più CompletionStages?
non capisco ciò che si sta cercando di fare. Qual è il tuo metodo 'combine'? Qual è il suo scopo? Cosa vuoi fare con 'CompletionStage's? Chi è il consumatore alla fine? Quale dovrebbe essere il risultato che ricevono? –
@SotiriosDelimanolis, 'combine' è una funzione che accetta 4 parametri e restituisce 1 di tipo' Combinato'. Il consumatore può essere ad esempio un'altra funzione che assume 'Combined' come parametro e restituisce un altro' CompletionStage', che viene invocato usando 'combinedDataCompletionStage.thenCompose (...)'. –