gpt4 book ai didi

java - 为什么这段代码片段中的 lambda 更好?

转载 作者:行者123 更新时间:2023-12-02 02:31:51 29 4
gpt4 key购买 nike

我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容

方法 1 中他们提到

"You would have to rewrite a lot of your API to accommodate this change. In addition, this approach is unnecessarily restrictive; what if you wanted to print members younger than a certain age, for example"

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 的另一个优点是,您可以提供面向 future 的方法,并且如果您的模型发生更改,您无需编写除特定条件之外的任何其他代码。

关于java - 为什么这段代码片段中的 lambda 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965954/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com