将Comparable的实例传递给期望Comparator的方法

时间:2014-05-17 14:06:47

标签: java java-8 comparator comparable functional-interface

Java 8中的Stream类定义了一个需要max参数的Comparator方法。这是方法签名:

Optional<T> max(Comparator<? super T> comparator)

Comparator是一个功能接口,具有带此签名的抽象compare方法。注意compare需要2个参数。

int compare(T o1, T o2)

Comparable接口具有带此签名的抽象compareTo方法。注意compareTo只需要一个参数。

int compareTo(T o)

在Java 8中,以下代码完美运行。但是,我期望编译错误,例如“Integer类没有定义compareTo(Integer,Integer)”。

int max = Stream.of(0, 4, 1, 5).max(Integer::compareTo).get();

有人可以帮助解释为什么可以将Comparable的实例传递给期望Comparator实例的方法,即使它们的方法签名不兼容吗?

1 个答案:

答案 0 :(得分:12)

这是关于方法引用的一个很好的功能。请注意,Integer::compareTo实例方法。您需要两个Integer个对象来调用它。一个在左侧(目标对象),一个在右侧(第一个也是唯一的参数)。

因此Integer::compareTo是方法的方法引用,它需要两个Integer个对象并返回intComparator<Integer>是函数的功能接口,它需要两个Integer个对象并返回int。这就是它起作用的原因。