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

Java 8流的.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());

据javadoc的.min().max(),两者的参数应该是一个Comparator。然而,这里的方法引用是针对Integer该类的静态方法的。

那么,为什么要编译呢?


问题答案:

让我解释一下这里发生的事情,因为它并不明显!

首先,Stream.max()接受的一个实例,Comparator以便可以将流中的项目彼此进行比较,从而以不需要担心太多的最佳顺序来找到最小值或最大值。

因此,问题当然是为什么被Integer::max接受?毕竟它不是比较器!

答案是,新的lambda功能可以在Java 8中工作。它依赖于一个被非正式地称为“单一抽象方法”接口或“ SAM”接口的概念。这个想法是,具有一个抽象方法的任何接口都可以由任何lambda(或方法引用)自动实现,这些方法的方法签名与接口上一个方法的匹配。因此,检查Comparator界面(简单版本):

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

如果一个方法正在寻找Comparator<Integer>,那么它实际上是在寻找这个签名:

int xxx(Integer o1, Integer o2);

我使用“ xxx”,因为方法名称未用于匹配目的。

因此,两者Integer.min(int a, int b)Integer.max(int a, int b)都足够接近,自动装箱将允许它Comparator<Integer>在方法上下文中显示为。



 类似资料:
  • 注意:这个问题源自一个死的链接,这是以前的一个SO问题,但这里是... 看到这段代码(注意:我确实知道这段代码不会“工作”,应该使用--我只是从链接的问题中提取出来的): 根据和的javadoc,两者的参数都应该是一个。然而,这里的方法引用是类的静态方法。

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

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

  • 问题内容: 为什么要编译Python脚本?您可以直接从.py文件运行它们,并且效果很好,那么在性能上有什么优势吗? 我还注意到,我的应用程序中的某些文件被编译为.pyc,而另一些则没有,为什么? 问题答案: 它被编译为字节码,可以更快,更快速地使用。 无法编译某些文件的原因是,每次运行脚本时都会重新编译与之一起调用的主脚本。所有导入的脚本将被编译并存储在磁盘上。 Ben Blank的 重要补充:

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

  • 问题内容: 在方法或类范围内,下面的行进行编译(带有警告): 在类范围中, 变量获取其默认值 ,以下给出“未定义引用”错误: 它不是第一个应该以相同的“未定义参考”错误结束吗?还是第二行应该编译?还是我缺少什么? 问题答案: tl; dr 对于 字段 ,是非法的,因为它是对的非法前向引用。您实际上可以通过编写来解决此问题,该文件可以毫无抱怨地进行编译。 对于 局部变量 ,是非法的,因为未在使用前进