3 回答
TA贡献1828条经验 获得超3个赞
我们是否使用 lambda 中的 CheckPerson 接口?
我们不使用它,我们定义它。我们给它一个实现。我们通过编写 lambda 表达式来实现该接口。
“in lambda”是你的误解,因为 lambda是该接口的一个实例。
他们说他们省略了方法,我在 lambda 中看不到任何测试——这很清楚。但他们也放弃了接口 CheckPerson 的名称。
这不是关于“丢弃”或“省略”某些东西。它是关于用另一种语法结构替换一种语法结构。您将匿名类替换为 lambda 表达式,以使您的代码更具表现力且更简洁。
TA贡献1807条经验 获得超9个赞
它在 Java 中称为 SAM(单一抽象方法)类型,是的,仍然使用接口。
让我们看一下 的签名printPersons
:
public static void printPersons(List<Person> roster, CheckPerson tester)
因此,Java 编译器知道,如果您为其提供 lambda,则该 lambda 应该遵守CheckPerson
提供的单个方法。
TA贡献1793条经验 获得超6个赞
出于所有意图和目的,lambda 表达式是一种语法糖,用于简化编写匿名类的方式。
这并不完全正确,因为编译器实际上并没有生成匿名类(尽管它可以生成),并且关键字之类的东西会this改变含义,但在其他方面它确实非常相似。
所以,使用匿名类的代码是:
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
}
现在,由于编译器知道 的第二个参数printPersons必须是一个CheckPerson对象,它可以在看到 lambda 表达式时推断出这一点。由于接口只有一个方法,它也可以推断出你需要实现这样一个方法。
但是,您仍然必须列出参数,这意味着如果您删除可以从前两行推断出的所有内容:
new CheckPerson() {
public boolean test(Person p) {
你得到:
(Person p) -> {
其中->是告诉编译器推断其余部分的 lambda 表达式语法。
到目前为止,我们已经减少了:
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
}
到:
(Person p) -> {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
现在我们应用更多的语法糖,即让编译器做更多的工作,以删除“模板”的东西。
参数类型可以推断出来,所以不需要给出。
如果只有一个参数,则不需要()括号。
如果方法中唯一的语句是return语句,则删除{}大括号、return关键字和;分号,只留下普通表达式。
结果:
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
这是简写 lambda 表达式(语法糖),用于执行与原始匿名类相同的操作。
添加回答
举报