Способ написания printEvenOrOdd
делает его более трудным, чем это должно быть. Проблема в том, что он не печатает слово «Четный» или «Нечетный», он возвращает это, что означает, что оригинал result
потерян. Остальные шаги основаны на фактическом количестве. Чтобы обойти это, вы можете использовать вызов printEvenOrOdd
и .thenApply(__ -> result)
, чтобы впоследствии восстановить исходный номер. Это будет выглядеть так:
System.out.println(
generateRandom(1, 100)
.thenCompose(result ->
printEvenOrOdd(result)
.thenAccept(System.out::println)
.thenApply(__ -> result)
)
.thenCompose(result ->
result % 2 == 0
? findFactorial(result)
: convertToNearestEvenInteger(result)
)
.join()
);
Лучшим решением было бы изменить определение printEvenOrOdd
на что-то вроде:
public CompletableFuture<Integer> printEvenOrOdd(int result) {
return CompletableFuture.supplyAsync(() -> {
System.out.println(result % 2 == 0 ? "Even" : "Odd");
return result;
});
}
Это упростит цепочку шагов 3 и 4:
System.out.println(
generateRandom(1, 100)
.thenApply(this::printEvenOrOdd)
.thenCompose(result ->
result % 2 == 0
? findFactorial(result)
: convertToNearestEvenInteger(result)
)
.join()
);