首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JDK8函数编程函数可以抛出一个异常吗?

JDK8函数编程函数可以抛出一个异常吗?
EN

Stack Overflow用户
提问于 2018-09-24 15:22:58
回答 2查看 125关注 0票数 3

我有一个要求

  1. 从员工存储库获取员工信息。
  2. 使用其他信息更新员工信息。
  3. 将employee对象转换为gatewayRequest对象。
  4. 调用网关服务并获得响应。
  5. 从响应中获取网关调用的返回代码。

对于这个需求,我使用函数式编程来实现这个结果。

在这里,我在服务层中创建了多个函数

代码语言:javascript
运行
复制
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方法来获得结果。

代码语言:javascript
运行
复制
getRegisteredEmployee.
       andThen(updateEmployeAddressandSave).
       andThen(transformTheEmployeeToGatewayRequest).
       andThen(allgateWayClinet).apply(12);

根据函数编程模型,函数应该接受输入并给出一些输出;它不应该抛出任何异常。但是在我的示例中,如果找不到employee,getRegisteredEmployee会抛出一个异常。

因此,我是否没有遵循函数式编程的核心原则?

函数编程中抛出异常的替代方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2018-09-24 15:49:54

虽然不遵守原则,但从技术上讲,可以创建一个功能接口,该接口将引发一个检查过的异常。

代码语言:javascript
运行
复制
@FunctionalInterface
interface CheckedFunction<A, B> {
  B apply(A a) throws Exception;
}

(由于您使用的是andThen,所以还需要使用default关键字来实现它。不过,请记住,函数接口最多必须有一个非默认方法,因此您必须提供默认的andThen实现。)

所以,举个例子,你可以做如下的事情:

代码语言:javascript
运行
复制
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>。)

票数 1
EN

Stack Overflow用户

发布于 2018-09-24 15:34:28

方法getRegisteredEmployee可以返回一个可选对象,而不是抛出异常。

代码语言:javascript
运行
复制
 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...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52482573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档