java - 将 Comparable 的实例传递给需要 Comparator 的方法

标签 java java-8 comparator comparable functional-interface

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/

相关文章:

java - Jetty 嵌入式服务器 - 更改部署 war 文件的路径

时间之前的 Java 日期在生产中无法按预期工作

java - Java 8 是否对供应商提供缓存支持?

c++ - 'std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique 需要

java - TreeSet 中执行 Comparator 后删除的元素

java - Java中HBase表的自定义过滤

java - 如何在本地开发环境中从 App Engine 访问 Google Cloud Storage?

java - 将基于 android Activity 的应用程序转换为基于 fragment 的应用程序时导致的错误

spring - 如何使用 JDK8 功能重写 jdbcTemplate 查询?

java - 为什么这个使用类型推断的 java 8 示例没有在 Eclipse 中编译?