我在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更好?
答案 0 :(得分:2)
小例子的问题在于它们有时会隐藏真正的好处。在这种情况下,他们正在查看包含报告逻辑的方法。方法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的另一个优点是,您可以提供未来证明的方法,如果您的模型发生变化,您将不必再编写除特定条件之外的其他代码。