Java 8 中的 Stream
类定义了一个 max
方法,它需要一个 Comparator
参数。这是方法签名:
Optional<T> max(Comparator<? super T> comparator)
Comparator
是一个函数式接口(interface),具有带有此签名的抽象 compare
方法。注意 compare
需要 2 个参数。
int compare(T o1, T o2)
Comparable
接口(interface)有一个带有此签名的抽象compareTo
方法。注意 compareTo
只需要 1 个参数。
int compareTo(T o)
在 Java 8 中,以下代码可以完美运行。但是,我预计会出现编译错误,例如“Integer 类未定义 compareTo(Integer, Integer)”。
int max = Stream.of(0, 4, 1, 5).max(Integer::compareTo).get();
有人可以帮助解释为什么可以将 Comparable
的实例传递给需要 Comparator
实例的方法,即使它们的方法签名不兼容吗?
最佳答案
这是关于方法引用 的一个很好的特性。注意 Integer::compareTo
是一个实例方法。你需要两个 Integer
对象来调用它。一个在左侧(目标对象),一个在右侧(第一个也是唯一的参数)。
所以 Integer::compareTo
是一个方法的方法引用,需要两个 Integer
对象并返回 int
. Comparator<Integer>
是函数的函数式接口(interface),需要两个Integer
对象并返回 int
.这就是它起作用的原因。
关于java - 将 Comparable 的实例传递给需要 Comparator 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23712248/