让我们举一些简单的示例代码:
Employee employee = repository.findById(id).orElseThrow(() -> new EmployeeNotFoundException(id));
根据我的理解,lambda是用来创建一个函数接口的subistute的(只有1个方法),空括号表示该方法没有参数。
但是在OrelsThrow中调用什么方法需要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);
}
}
Employee employee = repository.findById(id).orElseThrow(
new Supplier<Throwable>() {
@Override
public Throwable get() {
return new EmployeeNotFoundException(id);
}
}
)
我没有测试过,但我相信为了避免处理一般的throwable
(通过在方法签名中声明它或在封闭方法中捕获它),您需要提供一个供应商
或具有比runtimeexception
更具体类型的类似文件。例如:
Employee employee = repository.findById(id).orElseThrow(
new Supplier<EmployeeNotFoundException>() {
@Override
public EmployeeNotFoundException get() {
return new EmployeeNotFoundException(id);
}
}
);
由于EmployeeNotFoundException
是一个RuntimeException
,因此是一个未检查的异常,因此使用上述方法,编译器不会关心您是否处理该异常。
您至少部分地正确阅读了文档:我们传递给orelsethrow
的是一个supplier
,因此这是lambda实现的接口,也是我们需要实现的接口,无论我们传递一个方法引用、lambda还是像您的情况那样,传递一个用new
实例化的对象。supplier
是采用一个类型参数的泛型接口。文档还告诉我们,orelsethrow
需要一个供应商<?extends x>
,其中x extends throwable
,即x
是throwable
的子类型。因此传递供应商
并不是不正确的,但正如您所经历的那样,它在其他地方给您带来了一些麻烦。并且允许我们放入throwable
的任何子类型。输入RuntimeException
或EmployeeNotFoundException
可以使我们摆脱麻烦。
我不知道为什么你要这么罗嗦,虽然,当lambda工作很好。
链接:供应商
界面的文档
(译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂
Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。 语法 (Syntax) lambda表达式的特征在于以下语法。 parameter -> expression body 以下是lambda表达式的重要特征。 Optional type declaration - 无需声明参数类型。 编译器可以从参数的值推断出相同的
问题内容: 我正在尝试以的形式找到网页上的所有链接,或者我做了一个正则表达式,并且可以正常工作: 但是,有没有更短的写方法呢?我重复了:// [^ / \“] + /两次,可能没有必要。我尝试了各种方法,但是没有用。我尝试了: 很明显,我在这里缺少了一些东西,或者我只是对Python正则表达式不够了解。 问题答案: 您正在使用捕获组,并在使用捕获组时改变其行为(它只会返回捕获组的内容)。您的正则表
我现在正在学习如何使用lambda表达式,我已经看到了一些带有简单示例的教程: 但是我的编译器显示这个错误: 我是不是忘了什么?
问题内容: 我在Java 8映射操作中传递了一个Function,Intellij告诉我可以将其替换为lambda表达式。但是我不知道如何在不创建中间对象结构的情况下做到这一点。 这是我的工作: 我认为Intellij建议我这样做: 我不知道一种干净的方法来获取在匿名函数中检索到的objectType.getTempUrl()。getFullUrl()部分,有什么建议吗? 问题答案: 你总是可以写
我知道使用lambda expression(LE)我们可以节省一些代码行,比如为函数接口创建对象。而且LE将更易读。但我确信这并不是提供该功能的主要原因。我在google上搜索,并在本文中找到了这段有趣的引用 在Java8之前,处理任何集合的元素都可以通过从集合中获取迭代器,然后迭代元素,然后处理每个元素来完成。如果需要并行处理这些元素,那么将由客户端代码完成。随着Java 8中Stream A