首页 > 解决方案 > 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 跳过所有这些

标签: javaexceptionlambdaoptional

解决方案


通过查看可选的 JavaDoc 可以很容易地回答这个问题:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}

lambda 参数是提供要抛出的异常的供应商。


推荐阅读