繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM