为什么 lambda 在此代码片段中更好?



我正在阅读有关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的特定时刻,PersongetGender()方法甚至可能还不存在,因此不可能先验地提供printMalePersonsOlderThanAndYoungerThan。因此,方法 5 的另一个优点是,您可以提供面向未来的方法,如果您的模型发生变化,您将不必编写比特定条件更多的额外代码。

相关内容

  • 没有找到相关文章

最新更新