gpt4 book ai didi

Java 8 流 .min() 和 .max() : why does this compile?

转载 作者:IT老高 更新时间:2023-10-28 12:16:10 26 4
gpt4 key购买 nike

注意:这个问题源自之前的 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() 的 javadoc和 .max() ,两者的参数都应该是一个Comparator。然而这里的方法引用是对 Integer 的静态方法的引用。类。

那么,为什么要编译呢?

最佳答案

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

首先, Stream.max() 接受 Comparator 的实例,以便可以将流中的项目相互比较以找到最小值或最大值,以您无需过多担心的最佳顺序。

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

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

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>

关于Java 8 流 .min() 和 .max() : why does this compile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com