Java 8 是否最好在Mono<;对象>;

Java 8 是否最好在Mono<;对象>;,java-8,functional-programming,reactive-programming,project-reactor,Java 8,Functional Programming,Reactive Programming,Project Reactor,作为开发团队的一部分,我们希望构建一个非阻塞应用程序,因为我们正在使用SpringReactor 3构建我们的应用程序。因此,在使用project reactor时,我有一系列问题: 在单个管道和Mono上使用多个平面图是否是一种良好的做法,例如,如果emp的所有细节都有效,则存在验证emp信息的场景: @Getter @Setter public class Employee { private long empId; private String userName;

作为开发团队的一部分,我们希望构建一个非阻塞应用程序,因为我们正在使用SpringReactor 3构建我们的应用程序。因此,在使用project reactor时,我有一系列问题:

  • 在单个管道和
    Mono
    上使用多个平面图是否是一种良好的做法,例如,如果emp的所有细节都有效,则存在验证emp信息的场景:

    @Getter
    @Setter
    public class Employee {
         private long empId;
         private String userName;
         private String password;
    
    }
    public class FlatMapExample{
    public Mono<Emplyoee> doValidate(Emplyoee emp){
    
        Mono.just(emp).flatMap(this::validateEmpId)
              .flatMap(this::validateUserName)
              .flatMap(this::validatePassword);
    }
    private Mono<Emplyoee> validateEmpId(Emplyoee e){
     Mono.just(emp).flatMap(//here some check on empId)
    }
    
    private Mono<Emplyoee> validateUserName(Emplyoee e){
     Mono.just(emp).flatMap(//here some check userName calling another method which is performing some extra checks like the format of username/ null or empty userName)
    }
    
    private Mono<Emplyoee> validatePassword(Emplyoee e){
     Mono.just(emp).flatMap(//here some check to validate password by calling another method)
    }
    
    }
    
    @Getter
    @塞特
    公营雇员{
    私人长empId;
    私有字符串用户名;
    私有字符串密码;
    }
    公共类FlatMapExample{
    公共环境管理计划(雇员环境管理计划){
    Mono.just(emp.flatMap)(this::validateEmpId)
    .flatMap(this::validateUserName)
    .flatMap(this::validatePassword);
    }
    私人Mono validateEmpId(雇员e){
    Mono.just(emp.flatMap)(//这里检查一下empId)
    }
    私人雇员姓名(雇员e){
    Mono.just(emp.flatMap)(//这里一些check userName调用另一个方法,该方法正在执行一些额外的检查,如userName/null或空userName的格式)
    }
    私人密码(雇员e){
    Mono.just(emp.flatMap)(//这里有些检查通过调用另一个方法来验证密码)
    }
    }
    
  • 与map相比,flatMap的资源成本是否更高

  • 如果我们将使用映射,那么在映射内调用的方法应该返回一个简单对象,例如在上述情况下,如果我们使用映射,那么validateEmpId和其他方法的返回类型将仅为Employee。所以在这些方法中,我们不能使用管道,它将是简单的Java或者我们可以使用Java流。因此,在我看来,这将不是一个函数式编程

  • 数据验证是关键点,所以我认为最好同步这个过程

    此外,如果flatMap(this::validateEmpId)返回Mono.error(smth),您的下一个验证器将无法执行,因此您将无法返回完整的错误消息

    这篇文章的作者在webflux(反应堆)项目中使用了,所以我相信在您的示例中,更好的方法是这样的:

    public Mono<Emplyoee> doValidate(Emplyoee emp){
        /*validate */
        if(valid) {
            return Mono.just(emp);
        } else {
            return Mono.error(err);
        }
    }
    
    public Mono-doValidate(员工emp){
    /*证实*/
    如果(有效){
    返回Mono.just(emp);
    }否则{
    返回Mono.error(err);
    }
    }
    
    我认为您应该尝试简化验证api,例如:

    public Mono<Void> doValidate(Emplyoee emp){
      return validateEmpId(emp.getId())
        .then(validateUserName(emp.getUserName()))
        .then(validatePassword(emp);
    }
    private Mono<Void> validateEmpId(long id){
      // here some check on empId
    
      // if check ok return Mono.empty()
      // else return Mono.error(new YourException(...))
    }
    private Mono<Void> validateUserName(String userName){
      ...
    }
    private Mono<Void> validatePassword(Emplyoee emp){
      ...
    }
    
    public Mono-doValidate(员工emp){
    返回validateEmpId(emp.getId())
    .then(validateUserName(emp.getUserName()))
    .然后(验证密码(emp);
    }
    专用Mono validateEmpId(长id){
    //这里有一些关于empId的检查
    //如果选中ok,则返回Mono.empty()
    //else返回Mono.error(新的YourException(…)
    }
    私有Mono validateUserName(字符串用户名){
    ...
    }
    私人密码(雇员emp){
    ...
    }
    
    不再使用
    Mono.just(emp).flatMap