gpt4 book ai didi

java - Java 8 中的::(双冒号) 运算符

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:09 24 4
gpt4 key购买 nike

我正在探索Java 8源代码,发现代码的这个特定部分非常令人惊讶:

// Defined in IntPipeline.java
@Override
public final OptionalInt reduce(IntBinaryOperator op) {
return evaluate(ReduceOps.makeInt(op));
}

@Override
public final OptionalInt max() {
return reduce(Math::max); // This is the gotcha line
}

// Defined in Math.java
public static int max(int a, int b) {
return (a >= b) ? a : b;
}

Math::max 类似于方法指针吗?
普通的static方法如何转换为IntBinaryOperator

最佳答案

通常,人们会使用 Math.max(int, int) 调用 reduce 方法,如下所示:

reduce(new IntBinaryOperator() {
int applyAsInt(int left, int right) {
return Math.max(left, right);
}
});

仅调用 Math.max 就需要大量语法。这就是 lambda 表达式发挥作用的地方。从 Java 8 开始,允许以更短的方式执行相同的操作:

reduce((int left, int right) -> Math.max(left, right));

这是如何工作的? java 编译器“检测”您想要实现一个接受两个 int 并返回一个 int 的方法。这相当于接口(interface)IntBinaryOperator的唯一方法的形式参数(您要调用的方法reduce的参数)。因此编译器会为您完成剩下的工作 - 它只是假设您想要实现 IntBinaryOperator

但由于Math.max(int, int)本身满足IntBinaryOperator的形式要求,因此可以直接使用。由于 Java 7 没有任何允许将方法本身作为参数传递的语法(只能传递方法结果,而不能传递方法引用),因此 Java 8 中引入了 :: 语法来引用方法:

reduce(Math::max);

请注意,这将由编译器解释,而不是运行时由 JVM 解释!尽管它为所有三个代码片段生成不同的字节码,但它们在语义上是相同的,因此最后两个可以被认为是上面的 IntBinaryOperator 实现的简短(并且可能更有效)版本!

(另请参阅 Translation of Lambda Expressions )

关于java - Java 8 中的::(双冒号) 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768460/

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