让我解释一下这里发生的事情,因为它并不明显!
首先,
Stream.max()接受的一个实例,
Comparator以便可以将流中的项目彼此进行比较,从而以不需要担心太多的最佳顺序来找到最小值或最大值。
因此,问题当然是为什么被
Integer::max接受?毕竟它不是比较器!
答案是,新的lambda功能可以在Java 8中工作。它依赖于一个被非正式地称为“单一抽象方法”接口或“ SAM”接口的概念。这个想法是,具有一个抽象方法的任何接口都可以由任何lambda(或方法引用)自动实现,这些方法的方法签名与接口上一个方法的匹配。因此,检查Comparator界面(简单版本):
public Comparator<T> { T compare(T o1, T o2);}如果一个方法正在寻找
Comparator<Integer>,那么它实际上是在寻找这个签名:
int xxx(Integer o1, Integer o2);
我使用“ xxx”,因为方法名称未用于匹配目的。
因此,两者
Integer.min(int a, int b)和
Integer.max(int a, int b)都足够接近,自动装箱将允许它
Comparator<Integer>在方法上下文中显示为。



