首页 > 解决方案 > 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参数。

我知道我误解了一些东西,但我现在知道是什么了。有人可以解释一下吗?

标签: javajava-8java-stream

解决方案


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 语言规范。方法参考表达式以了解其工作原理。


推荐阅读