java-8 - JDK8函数式编程一个函数可以抛出异常吗?
问题描述
我有一个要求
- 从员工存储库中获取员工信息。
- 使用一些附加信息更新员工信息。
- 将员工对象转换为 gatewayRequest 对象。
- 调用网关服务并获得响应。
- 从响应中获取网关调用的返回码。
对于这个要求,我使用函数式编程来实现结果。
在这里,我在我的服务层中创建了多个功能
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);
根据函数式编程模型,函数应该接受输入并给出一些输出;它不应该抛出任何异常。但是在我的示例中getRegisteredEmployee
,如果找不到员工,则会引发异常。
因此,我没有遵循函数式编程的核心原则吗?
在函数式编程中抛出异常的替代方法是什么?
解决方案
虽然不遵守原则,但在技术上可以创建一个将抛出已检查异常的功能接口。
@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
}
正如我所提到的,这不符合原则;只有当我绝对必须将异常冒泡时,我才会走这条路。其他 Java 8 特性如Optional
更适合这种情况。(因为看起来您使用的是 spring 的 JPA 实现,所以您可以定义您的findById
方法以返回一个Optional<Employee>
.)
推荐阅读
- mysql - 如何在 mysql 中 N 秒后自动终止长时间运行的 MySQL 查询?
- sql - 匹配以特定字符结尾的东西,但不是那些在结束字符前面有东西的东西
- compiler-errors - 代码使用 netcore 编译,但不会使用 mono 编译
- java - Eclipse 富客户端应用程序连接到数据库
- android - 在 Xamarin 中使用 Wispr 进行 WiFi Web 身份验证
- r - 在参数列表上模拟 lapply / 循环
- mongodb - MongoDB:慢查询
- scala - scala 元组解包无法解析 UPPER 参数名称?
- ecmascript-6 - 通过数组过滤带有复选框的项目
- php - php - 如何发送多个 xml 请求(网络服务)