Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Orelse中的lambda表达式替代了什么?_Java_Exception_Lambda_Optional - Fatal编程技术网

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