Search code examples
javareactive-programmingproject-reactor

Project Reactor conditional execution of independent verification step


I can't figure it out, how to do this method without the 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) {
    //...
}

As you can see, the X and Y steps are independent of each other. Is there a nice, readable way of writing doAuthorization that does not use if/else and I only have to write down doYStep() once?


Solution

  • There is no way to do this without an if else while keeping it readable. Some options to do while keeping it readable include using "ternary operator" and new "switch case" introduced in Java 14.

    Reduce it to one line using ternary operator:

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

    Or use the new switch case:

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

    EDIT:

    Since you don't want to write doYStep twice, you can do:

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