[英]Why is lambda better in this code snippet?
我在https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html上阅读有关lambda的内容
他们在方法1中提到
“您必须重写许多API来适应此更改。此外,这种方法不必要地受到限制;例如,如果您想打印小于特定年龄的成员该怎么办?”
public static void printPersonsOlderThan(List<Person> roster, int age) {
for (Person p : roster) {
if (p.getAge() >= age) {
p.printPerson();
}
}
}
在方法5中,他们使用lambda表达式:
printPersons(
roster,
(Person p) -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
);
但是,即使在此lambda表达式中,当我们要修改搜索条件时,也必须修改API。
为什么在这里使用lambda比在第一种方法中使用自定义方法更好?
小例子的问题在于它们有时隐藏了真正的好处。 在这种情况下,他们正在寻找一种包含报告逻辑的方法。 方法1如下所示:
public static void printPersonsOlderThan(List<Person> roster, int age) {
for (Person p : roster) {
if (p.getAge() >= age) {
p.printPerson();
}
}
}
问题是,如果您需要其他报告,例如
您将必须为每个用例编写一个新方法,在其中重新实现for循环和打印说明:
for (Person p : roster) {
if ( specificCondition) {
p.printPerson();
}
}
您真正想要的是重用围绕该条件的所有逻辑,并且只为您的用例重写特定的搜索条件,而无需重写循环逻辑和打印逻辑。
在方法5中, printPersons
方法将lambda作为参数。
printPersons(
roster,
(Person p) -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
);
您可以将任何搜索查询传递给printPersons
方法,而不必编写新的方法,例如printMalePersonsOlderThanAndYoungerThan
,在这里您必须重新编写完整的for循环和所有打印指令。
在写入printPersons
的特定时刻, Person
getGender()
方法甚至可能不存在,因此不可能事先提供printMalePersonsOlderThanAndYoungerThan
。 因此,方法5的另一个优点是,您可以提供可以用于未来的方法,并且如果您的模型发生了变化,则无需编写除特定条件之外的任何其他代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.