Условное исполнение Project Reactor этапа независимой верификации - PullRequest
1 голос
/ 28 мая 2020

Я не могу понять, как сделать этот метод без if / else:

public Mono<Token> doAuthorization(InputDto dto) {
    if (isXStepNeeded(dto)) {
        return doXStep(dto)
            .then(doYStep(dto.getRfid()));
    } else {
        return doYStep(dto.getRfid());
    }
}

private boolean isXStepNeeded(InputDto  dto) {
    //simple non blocking check on the dto
}
private Mono<OtherDto> doXStep(InputDto  dto) {
    //checking something and returning Mono.error() if it fails
}
private Mono<Token> doYStep(String tokenUid) {
    //...
}

Как видите, шаги X и Y независимы друг от друга. Есть ли удобный, читаемый способ записи doAuthorization, который не использует if / else, и мне нужно записать doYStep () только один раз?

1 Ответ

1 голос
/ 28 мая 2020

Невозможно сделать это без if else, сохраняя при этом читабельность. Некоторые варианты, которые можно сделать, сохраняя его читабельность, включают использование «тернарного оператора» и нового «переключателя», введенного в Java 14.

Сократите его до одной строки, используя тернарный оператор :

return isXStepNeeded(dto) ? doXStep(dto).then(doYStep(dto.getRfid())) : doYStep(dto.getRfid());

Или используйте новый случай переключателя:

return switch (Boolean.toString(isXStepNeeded(dto))) {
    case "true" -> doXStep(dto).then(doYStep(dto.getRfid()));
    default -> doYStep(dto.getRfid());
};

EDIT:

Поскольку вы не хотите писать doYStep дважды, вы можете сделать:

return Mono.just(isXStepNeeded(dto))
        .filter(b -> b)
        .flatMap(b -> doXStep(dto))
        .then(doYStep(dto.getRfid()));
...