У меня есть несколько методов CompletionStage
, которые я хотел бы связать. Проблема в том, что результат первого будет определять, должны ли выполняться следующие. Прямо сейчас единственный способ добиться этого - это передать "специальные" аргументы в следующий CompletionStage
, чтобы он не выполнял полный код. Например:
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;
});
}
Так как весь код зависит от первого someCondition
(если он false
, тогда результат будет RESULT_1
, если не тогда весь код должен быть выполнен), эта конструкция выглядит немного уродливой для меня. Есть ли способ решить, должны ли выполняться методы 2-го (thenCompose(...)
) и 3-го (thenApply(...)
)?