Java 8流max()函数参数类型Comparator与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语言规范。方法参考表达式以了解其工作原理。

以上是 Java 8流max()函数参数类型Comparator与Comparable 的全部内容, 来源链接: utcz.com/qa/435259.html

回到顶部