项目反应堆条件验证

Project Reactor verification of conditions

告诉我如何在 Reactive 中处理条件。

我有简单的 DTO SignInRequestsignIn 方法。

public class SignInRequest {

  private String userName;
  private String password;
}

public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
    boolean isValid = StringUtils.isEmailValid(signInRequest.getUserName());
    return userService.findByEmail(signInRequest.getUserName())
        .switchIfEmpty(Mono.error(new NotFoundException("User not found [email: " + signInRequest.getEmail() + "]")))
        .filter(user -> passwordService.validatePassword(user.getPassword(), signInRequest.getPassword()))
        .switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
        .flatMap(this::generateTokens);
}

如何正确实现以下逻辑。

如果isValid == true 则调用findByEmail 方法。否则,调用 findByUsername

反应器链中没有 if-else,但我们可以让它像这样工作。

Mono.fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
    .filter(o -> o)
    .flatMap(o -> userService.findByEmail(signInRequest.getUserName()))
    .switchIfEmpty(userService.findByUsername(signInRequest.getUserName()))
    ...

就我个人而言,我认为最易读的实现如下:

public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
    return Mono
            .fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
            .flatMap(isValid ->
                    isValid ? userService.findByEmail(signInRequest.getUserName())
                            : userService.findByUsername(signInRequest.getUserName())
            )
            .switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
            .flatMap(this::generateTokens);
}