java - Java 8 流 max() 函数参数类型 Comparator vs Comparable
问题描述
我写了一些简单的代码,如下所示。这个类工作正常,没有任何错误。
public class Test {
public static void main(String[] args) {
List<Integer> intList = IntStream.of(1,2,3,4,5,6,7,8,9,10).boxed().collect(Collectors.toList());
int value = intList.stream().max(Integer::compareTo).get();
//int value = intList.stream().max(<Comparator<? super T> comparator type should pass here>).get();
System.out.println("value :"+value);
}
}
正如代码注释所示,该max()
方法应传递 type 的参数Comparator<? super Integer>
。
但Integer::compareTo
实现Comparable
接口 -不是 Comparator
。
public final class Integer extends Number implements Comparable<Integer> {
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
}
这怎么行?该max()
方法说它需要一个Comparator
参数,但它适用于Comparable
参数。
我知道我误解了一些东西,但我现在知道是什么了。有人可以解释一下吗?
解决方案
int value = intList.stream().max(Integer::compareTo).get();
上面的代码片段在逻辑上等价于以下代码:
int value = intList.stream().max((a, b) -> a.compareTo(b)).get();
这在逻辑上也等价于以下内容:
int value = intList.stream().max(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a.compareTo(b);
}
}).get();
Comparator
是一个函数式接口,可以用作 lambda 或方法引用,这就是您的代码编译和执行成功的原因。
我建议阅读Oracle 的方法参考教程(他们使用比较两个对象的示例)以及第15.13 节中的 Java 语言规范。方法参考表达式以了解其工作原理。
推荐阅读
- matlab - WindowKeyPressFcn 程序中断后执行
- javascript - iFrame 中的 PDF 被下载而不是显示
- xml - “targetNamespace”是一种创建命名空间以验证 XML 文档的方法吗?
- android - 活动不是从通知开始的
- c# - 访问移动设备属性数据
- java - 以编程方式打开 Wifi 热点并收到 WiFi 错误
- java - “原因:java.util.zip.ZipException:无效的 LOC 标头(错误的签名)”
- java - HashMap 的代理 NullPointerException
- java - 无法在 Sybase DB 中插入大字符串
- azure-ad-b2c - B2C Graph API - 即使启用 Directory.ReadWrite.All 也没有足够的权限