如何使用 Java 1.8 和 Spring 5 以函数式编程风格重写返回空 Mono 对象的逻辑
How do I re-write logic of returning an empty Mono object in a functional programming style using Java 1.8 and Spring 5
我有以下代码,在使用 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;
}
}
我使用 isPresent() 设置了 if 条件以确保 Employee 对象在 Optional 中不为空。
我想从 else 条件中删除它的 return null 检查,这样只要有空的 Employee Mono,就只有 return 空的 Mono。我是 lambda 和函数式编程的新手。请让我知道如何重写这个逻辑,也请让我理解,以便我将来可以自己完成。谢谢
您可以使用 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;
}
我有以下代码,在使用 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;
}
}
我使用 isPresent() 设置了 if 条件以确保 Employee 对象在 Optional 中不为空。
我想从 else 条件中删除它的 return null 检查,这样只要有空的 Employee Mono,就只有 return 空的 Mono。我是 lambda 和函数式编程的新手。请让我知道如何重写这个逻辑,也请让我理解,以便我将来可以自己完成。谢谢
您可以使用 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;
}