我正在阅读有关lambda的信息 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
在方法 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 的另一个优点是,您可以提供面向未来的方法,如果您的模型发生变化,您将不必编写比特定条件更多的额外代码。