如何使用Java 1.8和Spring 5以函数式编程风格重新编写返回空Mono对象的逻辑

时间:2018-08-01 05:05:13

标签: lambda java-8 functional-programming spring-webflux

在下面的代码中,在使用JDK 1.8和Spring 5构建的Java应用程序中,混合了使用Lambda的命令式编程风格和功能性编程风格。

public Mono updateEmpDetails(String compId,String 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;

    }

}

我使用

 if 条件来确保Employee对象在可选中使用isPresent()不为空。

我想从其他条件中删除其返回null 检查,以便每当有一个空的Employee Mono时,就返回一个空Mono。我是lambda和函数式编程的新手。请让我知道如何重新编写此逻辑,并请我也理解一下,以便将来我能自己做。谢谢

1 个答案:

答案 0 :(得分:3)

您可以使用maporElse函数,如下所示:

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;
}