我有一个要求
对于这个需求,我使用函数式编程来实现这个结果。
在这里,我在服务层中创建了多个函数
final Function<String, Employee> getRegisteredEmployee =
localId -> employeeRepository.findById(employeeId).
orElseThrow(() -> new ResourceNotFoundException("ResourceNotFound"));
final Function<Employee, Employee> updateEmployeAddressandSave =
employe -> {
String status = //some logic to identitythe Employee
Employee e = new Employee(employee.getName(),employee.getAddress ,"INTERNAL_EMPLOYEE")
Employee emp = employeeRepository.save(e);
return emp;
};
同样,我创建了不同的函数,然后使用函数接口的andThen
方法来获得结果。
getRegisteredEmployee.
andThen(updateEmployeAddressandSave).
andThen(transformTheEmployeeToGatewayRequest).
andThen(allgateWayClinet).apply(12);
根据函数编程模型,函数应该接受输入并给出一些输出;它不应该抛出任何异常。但是在我的示例中,如果找不到employee,getRegisteredEmployee
会抛出一个异常。
因此,我是否没有遵循函数式编程的核心原则?
函数编程中抛出异常的替代方法是什么?
发布于 2018-09-24 15:49:54
虽然不遵守原则,但从技术上讲,可以创建一个功能接口,该接口将引发一个检查过的异常。
@FunctionalInterface
interface CheckedFunction<A, B> {
B apply(A a) throws Exception;
}
(由于您使用的是andThen
,所以还需要使用default
关键字来实现它。不过,请记住,函数接口最多必须有一个非默认方法,因此您必须提供默认的andThen
实现。)
所以,举个例子,你可以做如下的事情:
public void doThings(Integer id) throws Exception {
CheckedFunction<Integer, Employee> fn = (id) -> someMethodThatReturnsAnEmployeeOrThrows(id);
fn.apply(id)
.map( ... ) // ... some other stuff
}
正如我刚才所说,这是不符合原则的,我只会在一定要把例外情况抛出来的时候才走这条路。其他Java8特性,如Optional
,在这种情况下更合适。(因为看起来您使用的是spring的JPA实现,所以可以定义findById
方法来返回Optional<Employee>
。)
发布于 2018-09-24 15:34:28
方法getRegisteredEmployee可以返回一个可选对象,而不是抛出异常。
final Function<String, Employee> getRegisteredEmployee =
localId -> employeeRepository.findById(employeeId);
final Function<Employee, Employee> updateEmployeAddressandSave =
employe -> {
if(employe.isPresent()) {
employe.get();
...
String status = //some logic to identitythe Employee
Employee e = new Employee(employee.getName(),employee.getAddress ,"INTERNAL_EMPLOYEE")
Employee emp = employeeRepository.save(e);
return new Optional(emp);
} else {
return Optional.empty();
}
};
etc...
https://stackoverflow.com/questions/52482573
复制相似问题