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

Java8流的.min()和.max():为什么要编译?

廉高邈
2023-03-14

注意:这个问题源自一个死的链接,这是以前的一个SO问题,但这里是...

看到这段代码(注意:我确实知道这段代码不会“工作”,应该使用integer::compare--我只是从链接的问题中提取出来的):

final ArrayList <Integer> list 
    = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList());

System.out.println(list.stream().max(Integer::max).get());
System.out.println(list.stream().min(Integer::min).get());

根据.min().max()的javadoc,两者的参数都应该是一个比较器。然而,这里的方法引用是integer类的静态方法。

共有1个答案

吴正祥
2023-03-14

让我来解释一下这里发生了什么,因为这并不明显!

首先,stream.max()接受comparator的一个实例,以便可以将流中的项彼此进行比较,以找到最小值或最大值,这是您不需要太担心的最佳顺序。

所以问题当然是,为什么integer::max被接受?毕竟它不是一个比较器!

public Comparator<T> {
    T compare(T o1, T o2);
}

如果一个方法正在查找比较器 ,那么它实际上是在查找以下签名:

int xxx(Integer o1, Integer o2);

我使用“xxx”是因为方法名不用于匹配目的。

因此,integer.min(int a,int b)integer.max(int a,int b)都非常接近,因此自动装箱将允许它在方法上下文中作为比较器 出现。

 类似资料:
  • 问题内容: 注意:这个问题源自于先前的SO问题的无效链接,但是这里… 参见下面的代码(注意:我确实知道该代码不会“起作用”,应该使用-我只是从链接的问题中提取了它): 据javadoc的和,两者的参数应该是一个。然而,这里的方法引用是针对Integer该类的静态方法的。 那么,为什么要编译呢? 问题答案: 让我解释一下这里发生的事情,因为它并不明显! 首先,接受的一个实例,以便可以将流中的项目彼此

  • 在java 8中,流API帮助我们以非常干净和更少的代码完成工作。我是这些流API的忠实粉丝。但是很少有操作能够帮助解决同一类型的问题,也不确定何时使用哪种操作,虽然在两者之间进行选择并不困难,但只想知道任何一种操作都有针对这些操作的特定用例。我所说的操作是:- 中间操作:-最小值和最大值 终端操作:

  • 本文向大家介绍width属性的min-content和max-content有什么作用?相关面试题,主要包含被问及width属性的min-content和max-content有什么作用?时的应答技巧和注意事项,需要的朋友参考一下 max-content 在一个父元素上设置该元素后,元素的宽度会以子元素内最长的一个为准,子元素表现得会好像设置了white-space:nowrap一样一行展示 mi

  • 问题内容: 任何人都可以从官方MySQL文档中澄清这一点 使用索引…查找特定索引列key_col的MIN()或MAX()值。这由预处理器优化,该预处理器检查是否在索引中在key_col之前出现的所有关键部分上使用WHERE key_part_N =常量。在这种情况下,MySQL对每个MIN()或MAX()表达式执行一次键查找,并将其替换为常量。如果所有表达式都用常量替换,查询将立即返回。例如: S

  • (也会出现相同的行为) 我知道可以通过使用来避免这种行为。但当顺序颠倒时,是什么原因导致变化的呢?对输入顺序是否敏感?

  • 它编译,并工作... 好的,在最后一个问题中,使用了一个类中的静态方法。 但现在不同了:是的字段,是的;它也是一个,有一个方法,在本例中,该方法恰好与的签名匹配,而所期望的是。 这里是一个完全不同的范围,因为我启动了一个新的实例,并且可以在这个实例构建后立即使用方法引用! 那么,方法引用真的是任何服从签名的方法吗?有什么限制?是否存在可以构建“@functionalinterface兼容”的方法而