通常,可以使用Math.max(int,int)调用reduce方法,如下所示:
reduce(new IntBinaryOperator() {
int applyAsInt(int left, int right) {
return Math.max(left, right);
}
});
这需要很多语法来调用Math.max.这就是lambda表达式发挥作用的地方.从Java 8开始,它允许以更短的方式执行相同的操作:
reduce((int left, int right) -> Math.max(left, right));
这是如何运作的? java编译器“检测”,您要实现一个接受两个int并返回一个int的方法.这相当于接口IntBinaryOperator的唯一方法的形式参数(要调用的方法reduce的参数).所以编译器会为您完成剩下的工作 – 它只是假设您要实现IntBinaryOperator.
但是当Math.max(int,int)本身满足IntBinaryOperator的形式要求时,它可以直接使用.因为Java 7没有任何允许方法本身作为参数传递的语法(您只能传递方法结果,但从不传递方法引用),所以在Java 8中引入了:: syntax语法来引用方法:
reduce(Math::max);
请注意,这将由编译器解释,而不是由JVM在运行时解释!虽然它为所有三个代码片段生成不同的字节码,但它们在语义上是相同的,因此最后两个可以被认为是上面的IntBinaryOperator实现的短(并且可能更有效)版本!