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

时间:2017-10-27 00:57:49

标签: java lambda

我在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 个答案:

答案 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的另一个优点是,您可以提供未来证明的方法,如果您的模型发生变化,您将不必再编写除特定条件之外的其他代码。