在Java8中,方法引用是使用::操作符完成的。
,例如
// Class that provides the functionality via it's static method
public class AddableUtil {
public static int addThemUp(int i1, int i2){
return i1+i2;
}
}
// Test class
public class AddableTest {
// Lambda expression using static method on a separate class
IAddable addableViaMethodReference = AddableUtil::addThemUp;
...
}您可以看到,addableViaMethodReference现在的作用就像AddableUtil::addThemUp的别名。因此,addableViaMethodReference()将执行与AddableUtil.addThemUp()相同的操作,并返回相同的值。
为什么他们选择引进新的运营商而不是使用现有的运营商?我的意思是,当函数名以()结尾时执行函数,在没有尾随的()时返回函数引用。
方法执行
AddableUtil.addThemUp();方法参考
AddableUtil.addThemUp;这不是更简单,更直观吗?AFAIK,AddableUtil.addThemUp目前没有(Java7)用于任何其他用途,并引发编译错误。为什么不利用这个机会而不是创造一个全新的经营者呢?
发布于 2014-10-27 15:40:52
以下代码在Java 8中编译得很好,但是如果没有新的操作符,代码就会不明确:
import java.util.function.IntBinaryOperator;
public class A {
public static IntBinaryOperator addThemUp;
public static int addThemUp(int i1, int i2) {
return i1 + i2;
}
public static void main(String[] args) throws Exception {
IntBinaryOperator operator = A::addThemUp;
}
}还不清楚A.addThemUp是引用公共IntBinaryOperator字段,还是试图创建方法引用。
是的,有点人为的。但是您不能允许编程语言语法中的边缘情况。
发布于 2014-10-27 16:56:46
字段和方法有单独的名称空间,因此有可能在方法名称和字段名之间出现歧义(然后可能需要更多的规则来消除歧义)。对于“重用一些现有语法”方法来说,这无疑是一个大问题( BTW被认为是候选的,其他一些可能性也是如此)。
但是,我会把问题转过来:“重载”这样的现有语法真的是个好主意吗?(你的问题假定了这一点,但这是一个巨大的假设。)“调用方法m/ read字段f”和“按名称引用方法m/ field f”有很大的区别。这两种表达方式不应该不一样吗?重用现有语法来表示完全不同的意思有什么好处?
此外,您建议的方法存在一个可伸缩性问题:如果不发明新的语法,我们将来就永远无法进行字段引用,这将与方法引用的语法不同。虽然对于lambda来说,字段引用不是必需的,但是永远无法完成这里的工作将是一个很大的损失。
这些只是促成这一决定的各种考虑因素中的几个。事后看来,我仍然认为我们在这里打的电话是对的。
发布于 2014-10-29 05:57:03
也许他们这样做是为了让C++程序员在/*中感到更受欢迎(作为怀疑论者使用的危险词汇),操作符::在静态方法上使用更自然,因为它是C++ */中的范围解析操作符。
https://stackoverflow.com/questions/26590453
复制相似问题