Java Orelse中的lambda表达式替代了什么?
让我们看一些简单的示例代码:Java Orelse中的lambda表达式替代了什么?,java,exception,lambda,optional,Java,Exception,Lambda,Optional,让我们看一些简单的示例代码: Employee employee = repository.findById(id).orElseThrow(() -> new EmployeeNotFoundException(id)); 据我所知,lambda用于创建函数接口的子域(只有1个方法),空括号表示该方法没有参数 但是在orElseThrow中调用了什么方法,需要lambda呢?我认为它要么是一个可选的,要么是一个异常 所以我的问题是:如果没有lambda呼叫,情况会如何 员工类别: cl
Employee employee = repository.findById(id).orElseThrow(() -> new EmployeeNotFoundException(id));
据我所知,lambda用于创建函数接口的子域(只有1个方法),空括号表示该方法没有参数
但是在orElseThrow中调用了什么方法,需要lambda呢?我认为它要么是一个可选的
,要么是一个异常
所以我的问题是:如果没有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);
}
}
)
Employee-Employee=repository.findById(id).orelsetrow(
新供应商(){
@凌驾
公众可丢弃的物品{
返回新的EmployeeNotFoundException(id);
}
}
)
但这是不对的,因为现在我需要在方法签名中添加一个例外,这在使用lambda时不是这样的。这表明我不知道如何手动实现supplier类,而不是通过使用lambda跳过所有这些,这很容易通过查看JavaDoc中的可选:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
public T orelsetrow(Supplier接受a,此Supplier
用于获取Exception
的实例,如果Optional
下面有null
值,则将抛出该实例。请参阅Optional::orelsetrow
的实现:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (this.value != null) {
return this.value;
} else {
throw (Throwable)exceptionSupplier.get();
}
}
符合可选::orElseThrow
方法所期望的供应商
-供应商orElseThrow
是可选
类的一种方法,具有以下签名:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
public T或lsetrow(供应商我还没有测试过,但我相信为了避免处理一般的可丢弃的
(通过在方法签名中声明或在封闭方法中捕获)您需要提供比运行时异常
更具体的类型的供应商
或类似供应商。例如:
Employee employee = repository.findById(id).orElseThrow(
new Supplier<EmployeeNotFoundException>() {
@Override
public EmployeeNotFoundException get() {
return new EmployeeNotFoundException(id);
}
}
);
Employee-Employee=repository.findById(id).orelsetrow(
新供应商(){
@凌驾
public EmployeeNotFoundException get(){
返回新的EmployeeNotFoundException(id);
}
}
);
由于EmployeeNotFoundException
是一个RuntimeException
,因此是一个未经检查的异常,对于上述异常,编译器将不关心您是否处理该异常
您已经正确地阅读了文档,至少部分是这样的:我们传递给orelsetrow
的是供应商
,因此这是lambda实现的接口,也是我们需要实现的接口,无论我们传递的是方法引用、lambda还是在您的情况下,传递的是用new
实例化的对象。Supplier
是一个采用一种类型参数的通用接口。文档还告诉我们,orelsetrow
期望供应商在询问之前您做了哪些搜索和研究?例如,查看了?请在首先询问搜索和研究时,告诉我们您发现了什么,以及它是如何不足的。这使为了更好的问题和更好的答案,这是为了你自己。相关:。我已经阅读了文档,但是我的java知识有点生疏,我很难理解到底被替换了什么。如果没有lambda,我不知道如何编写orElseThrow,例如,将供应商作为一个不知名的类放在那里
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
Employee employee = repository.findById(id).orElseThrow(
new Supplier<EmployeeNotFoundException>() {
@Override
public EmployeeNotFoundException get() {
return new EmployeeNotFoundException(id);
}
}
);