Lambda表达式与新的Streams API相结合
如大家所了解的,程序员常常使用Java 8来编写更简洁、更灵活的代码,例如,他们可以将lambda表达式与新的Streams API相结合,来表达丰富的数据处理查询:
int total = invoices.stream() .filter(inv -> inv.getMonth() == Month.JULY) .mapToInt(Invoice::getAmount) .sum();上面的示例演示了如何从发票集合中计算 7 月份应付的总金额。传递一个 lambda 表达式以查找月份为 7 月份的发票,并传递一个方法引用以从发票中查找金额。 您可能想知道 Java 编译器是如何在幕后实现 lambda 表达式和方法引用的,以及 Java 虚拟机 (JVM) 是如何处理它们的。
例如,lambda 表达式只是匿名内部类的语法糖吗?毕竟,上面的代码可以通过将 lambda 表达式的主体复制到匿名类的相应方法的主体中来翻译:
int total = invoices.stream() .filter(new Predicate<Invoice>() { @Override public boolean test(Invoice inv) { return inv.getMonth() == Month.JULY; } }) .mapToInt(new ToIntFunction<Invoice>() { @Override public int applyAsInt(Invoice inv) { return inv.getAmount(); } }) .sum();