gpt4 book ai didi

java-8 - JDK8函数式编程一个函数能抛出异常吗?

转载 作者:行者123 更新时间:2023-12-01 07:40:16 25 4
gpt4 key购买 nike

我有一个要求

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

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

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

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

同样,我创建了不同的函数,然后使用函数式接口(interface)的 andThen 方法来获取结果

getRegisteredEmployee.
andThen(updateEmployeAddressandSave).
andThen(transformTheEmployeeToGatewayRequest).
andThen(allgateWayClinet).apply(12);

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

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

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

最佳答案

虽然不遵守原则,但在技术上可以创建一个将抛出已检查异常的功能接口(interface)。

@FunctionalInterface
interface CheckedFunction<A, B> {
B apply(A a) throws Exception;
}

(由于您使用的是 andThen,因此您还需要使用 default 关键字来实现它。不过请记住,功能接口(interface)最多只能有一个非默认方法,因此您将必须提供默认的 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> 。)

关于java-8 - JDK8函数式编程一个函数能抛出异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52482573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com