代码之家  ›  专栏  ›  技术社区  ›  Vinod Kumar

如何使用Java1.8和Spring5以函数式编程方式重新编写返回空Mono对象的逻辑

  •  2
  • Vinod Kumar  · 技术社区  · 6 年前

    下面的代码是在使用JDK 1.8和Spring 5构建的Java应用程序中使用Lambda的命令式编程风格和函数式编程风格的混合。

    公共Mono updateEmpDetails(字符串compId,字符串userId, 字符串城市){

    logger.info("Entering updateEmpDetails@EmployeeService");
    
    final UserKey userKey = getCommerceObj(compId, userId);
    Optional <Employee> emp = EmployeeRepository.findById(userKey);
    
    if (emp.isPresent()) {
      Employee empObj = emp.get();
      empObj.setCity(city);
      final Mono<Employee> Employee = asyncRunner
                    .one(() -> EmployeeRepository.saveAndFlush(empObj))                 
                    .doOnNext(value -> new CommonService().refreshMap())
          .doOnError(error -> logger.error("Error while persisting Emp User Object: ", error))
          .map(EmployeeObj -> EmployeeObj);
      logger.info("Exiting updateEmpDetails@EmployeeService");
      return Employee;
    
    }else{
        return null;
    
        }
    
    }
    

    我把 如果 使用isPresent()确保可选Employee对象不为空的条件。

    我想删除它 返回空 从else条件中检查,这样每当有空Mono的Employee就返回空Mono。我对lambda和函数式编程很陌生。请让我知道如何重新编写这个逻辑,并请让我明白,以便我可以在未来自己做。谢谢

    1 回复  |  直到 6 年前
        1
  •  3
  •   Sukhpal Singh    6 年前

    你可以用 map orElse 功能如下:

    public Mono updateEmpDetails(String compId, String userId, String city) {
        logger.info("Entering updateEmpDetails@EmployeeService");
        final UserKey userKey = getCommerceObj(compId, userId);
        Optional <Employee> emp = EmployeeRepository.findById(userKey);
        return emp.map(e -> updateEmployee(e, city)).orElse(Mono.empty());
    }
    
    private Mono<Employee> updateEmployee(Employee empObj, String city) {
        empObj.setCity(city);
        final Mono<Employee> Employee = asyncRunner
                    .one(() -> EmployeeRepository.saveAndFlush(empObj))                 
                    .doOnNext(value -> new CommonService().refreshMap())
          .doOnError(error -> logger.error("Error while persisting Emp User Object: ", error))
          .map(EmployeeObj -> EmployeeObj);
        logger.info("Exiting updateEmpDetails@EmployeeService");
        return Employee;
    }