java - orElseThrow 中的 lambda 表达式替代了什么?
问题描述
让我们看一些简单的示例代码:
Employee employee = repository.findById(id).orElseThrow(() -> new EmployeeNotFoundException(id));
据我了解,lambda用于创建功能接口的子类(只有1个方法),空括号表示该方法没有参数。
但是在 orElseThrow 中调用了什么方法需要 lambda?我以为它是一个Optional
或一个Exception
。
所以我的问题是:如果没有 lambda 调用,这会是什么样子?
员工等级:
class Employee {
private Long id;
private String name;
private String role;
Employee() {}
Employee(String name, String role) {
this.name = name;
this.role = role;
}
}
和异常类:
class EmployeeNotFoundException extends RuntimeException {
EmployeeNotFoundException(Long id) {
super("Could not find employee " + id);
}
}
编辑:我对如何为 lambda 表达式编写有效的、可编译的替换感兴趣。现在我在
Employee employee = repository.findById(id).orElseThrow(
new Supplier<Throwable>() {
@Override
public Throwable get() {
return new EmployeeNotFoundException(id);
}
}
)
但这是不对的,因为现在我需要将异常添加到方法签名中,而使用 lambda 时并非如此。它表明我不知道如何手动实现供应商类,而不仅仅是通过使用 lambda 跳过所有这些
解决方案
通过查看可选的 JavaDoc 可以很容易地回答这个问题:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
lambda 参数是提供要抛出的异常的供应商。
推荐阅读
- r - 如何在使用 Shiny 的 flexdashboard 中调整 Highcharter 子图的大小?
- c++ - 还获取 CXXRecordDecl 的继承字段
- python - 不知道如何继续这个不和谐的python代码
- c++ - 如何在 cpp windows 中创建恶魔进程?
- git - 我应该如何将 Git 用于项目的不同模块?
- odoo - 在新窗口中打开 ir.actions.report
- python - 正则表达式保留 \w,单词之间的连字符并删除数字
- python - 如何通过给定点计算旋转和平移
- nuxt.js - 目标:“静态”不在 nuxt 中预渲染
- git - 将本地 repo 从 master 更改为 main 以将文件推送到 github 上的 master repo