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