当前位置: 首页 > 面试题库 >

Java 8流max()函数参数类型Comparator与Comparable

方昊
2023-03-14
问题内容

我写了一些简单的代码,如下所示。此类运行良好,没有任何错误。

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



 类似资料:
  • 我知道我误解了一些事情,但我现在知道是什么了。谁能解释一下吗?

  • 我想使返回数据类型的的函数与传入的参数的数据类型相同。例如,我会这样调用函数: 因为我将一个传递给,所以它返回了一个

  • 问题内容: 从本文看来,它们都具有相同的大小容量:http : //msdn.microsoft.com/zh- cn/library/ms143432.aspx 这是真的吗?真正的区别是什么? 我只是从oracle(clob)迁移了一些数据,并将其制作为varchar(max),但无论如何它似乎都截断了一些值,我应该改用TEXT吗? 谢谢! 问题答案: 不,您不应使用。首先,自SQL Serve

  • 我正在用Java构建一个库管理应用程序。 我有一个名为 的抽象类。它有一个称为 的抽象方法。 有一个名为< code>Newspaper的子类,它当然实现了< code>equals,其签名与< code>equals在< code>Material中的签名完全相同: Java无法解析< code > elementoacomparer 的任何方法。它们都存在于< code >报纸中,该报纸确实扩

  • 本文向大家介绍Python函数参数类型*、**的区别,包括了Python函数参数类型*、**的区别的使用技巧和注意事项,需要的朋友参考一下 刚开始学习python,python相对于java确实要简洁易用得多。内存回收类似hotspot的可达性分析, 不可变对象也如同java得Integer类型,with函数类似新版本C++的特性,总体来说理解起来比较轻松。只是函数部分参数的"*"与"**",闭包

  • MariaDB 函数用于检索表达式的最大值。 语法: 数据准备 在数据库中创建一个表,并插入一些数据。参考以下创建语句 - 1. MAX()函数与单表达式 示例: 查询表的最低分数。参考以下查询语句 - 执行上面查询语句,得到以下结果 - 2. MAX()函数与GROUP BY子句 可以使用函数的子句来分组。 再插入一条重复的数据 - 当前数据库中的记录如下 - 示例: 执行上面查询语句,得到以下