Encadenando varios CompletionStage solo si se logra una condición
Yo tengo variasCompletionStage
métodos que me gustaría encadenar. El problema es que el resultado del primero determinará si se deben ejecutar los siguientes. En este momento, la única forma de lograr esto parece ser pasar argumentos "especiales" al siguienteCompletionStage
entonces no ejecuta el código completo. Por ejemplo:
public enum SomeResult {
RESULT_1,
RESULT_2,
RESULT_3
}
public CompletionStage<SomeResult> someMethod(SomeArgument someArgument) {
return CompletableFuture.supplyAsync(() -> {
// loooooong operation
if (someCondition)
return validValue;
else
return null;
}).thenCompose(result -> {
if (result != null)
return someMethodThatReturnsACompletionStage(result);
else
return CompletableFuture.completedFuture(null);
}).thenApply(result -> {
if (result == null)
return ChainingResult.RESULT_1;
else if (result.someCondition())
return ChainingResult.RESULT_2;
else
return ChainingResult.RESULT_3;
});
}
Dado que todo el código depende de la primerasomeCondition
(si esfalse
entonces el resultado seráRESULT_1
, si no, entonces debería ejecutarse todo el código) esta construcción me parece un poco fea. ¿Hay alguna manera de decidir si 2nd (thenCompose(...)
) y tercero (thenApply(...)
) los métodos deben ejecutarse?