如大家所了解的,程序员常常使用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();