【发布时间】:2019-09-05 17:18:04
【问题描述】:
我写了一些简单的代码,如下所示。这个类工作正常,没有任何错误。
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() 方法应该传递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 参数。
我知道我误解了一些东西,但我现在知道是什么了。谁能解释一下?
【问题讨论】:
-
Integer::compareTo不返回 Comparable - 它是以下的简短定义:“请编译器为所需的类型生成匹配的实现(在本例中为Comparator)并将参数映射到指定的功能。”在这种情况下,该函数需要两个“参数”(this和一个参数compareTo),并且比较器提供两个参数 -> 有效。 -
""请编译器,生成..." ...编译器总是对礼貌和礼貌做出最好的反应:-)
标签: java java-8 java-stream