当前位置: 首页 > 知识库问答 >
问题:

传递与需要比较器的方法相比较的实例

杨骏
2023-03-14

Java8中的stream类定义了一个max方法,该方法需要一个comparator参数。下面是方法签名:

Optional<T> max(Comparator<? super T> comparator)
int compare(T o1, T o2)
int compareTo(T o)

在Java8中,下面的代码可以很好地工作。但是,我预计会出现类似“Integer类没有定义compareTo(Integer,Integer)”这样的编译错误。

int max = Stream.of(0, 4, 1, 5).max(Integer::compareTo).get();

有人能解释为什么可以将carable的实例传递给需要comparator实例的方法,尽管它们的方法签名不兼容?

共有1个答案

归浩博
2023-03-14

这是关于方法引用的一个很好的特性。注意Integer::Compareto是一个实例方法。您需要两个integer对象来调用它。一个在左边(目标对象),一个在右边(第一个也是唯一的参数)。

因此Integer::Compareto是一个方法的方法引用,该方法需要两个Integer对象并返回一个Intcomparator 是函数的函数接口,这些函数需要两个integer对象并返回一个int。这就是它起作用的原因。

 类似资料:
  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 我有一个客户对象类,它有一些变量,并且已经实现了一个关于其中一个变量的比较器。然而,我需要为不同的变量last_name实现另一个比较器。 因为我的Customer类中不能有2个compareTo()方法,所以我决定在这里专门创建一个Comparing类 但一旦触及Collections.sort(客户); 它不会激活下面的公共int比较(Customer Customer_1,Customerc

  • 我是一名自学型开发人员,现在正在学习Java。我了解到,要对函数接口使用方法引用,我们引用的方法的签名必须与该函数接口内抽象方法的签名匹配。 但是在学习比较器时,发现“Comparator.comparing()”方法接受函数接口并返回一个比较器。我知道函数接口的抽象方法必须接受一个参数并返回一个值。 但是我可以将任何部分(而不是完全)匹配Function接口签名的方法(作为方法参考)传递给比较器

  • 嗨,我是贾维斯的新手。 我有一个实体,我正在为它实现一个自定义比较器,以便使用Javers进行比较。 我的实体:- 包装com.devyansh.entity; 进口java.util.清单; 导入组织。贾维斯。果心元模型。注释。实体 下面我注册了新的比较器:- 我的比较器实现:- 问题领域:- 每当我尝试使用以下行进行比较时:- Diff Diff=标枪。比较(new Ent(“aaa”,new

  • 问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通