首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java 8为方法引用引入了一个新的"::“操作符?

为什么Java 8为方法引用引入了一个新的"::“操作符?
EN

Stack Overflow用户
提问于 2014-10-27 14:59:21
回答 3查看 3K关注 0票数 25

在Java8中,方法引用是使用::操作符完成的。

,例如

代码语言:javascript
复制
// 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()相同的操作,并返回相同的值。

为什么他们选择引进新的运营商而不是使用现有的运营商?我的意思是,当函数名以()结尾时执行函数,在没有尾随的()时返回函数引用。

方法执行

代码语言:javascript
复制
AddableUtil.addThemUp();

方法参考

代码语言:javascript
复制
AddableUtil.addThemUp;

这不是更简单,更直观吗?AFAIK,AddableUtil.addThemUp目前没有(Java7)用于任何其他用途,并引发编译错误。为什么不利用这个机会而不是创造一个全新的经营者呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-27 15:40:52

以下代码在Java 8中编译得很好,但是如果没有新的操作符,代码就会不明确:

代码语言:javascript
复制
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字段,还是试图创建方法引用。

是的,有点人为的。但是您不能允许编程语言语法中的边缘情况。

票数 33
EN

Stack Overflow用户

发布于 2014-10-27 16:56:46

字段和方法有单独的名称空间,因此有可能在方法名称和字段名之间出现歧义(然后可能需要更多的规则来消除歧义)。对于“重用一些现有语法”方法来说,这无疑是一个大问题( BTW被认为是候选的,其他一些可能性也是如此)。

但是,我会把问题转过来:“重载”这样的现有语法真的是个好主意吗?(你的问题假定了这一点,但这是一个巨大的假设。)“调用方法m/ read字段f”和“按名称引用方法m/ field f”有很大的区别。这两种表达方式不应该不一样吗?重用现有语法来表示完全不同的意思有什么好处?

此外,您建议的方法存在一个可伸缩性问题:如果不发明新的语法,我们将来就永远无法进行字段引用,这将与方法引用的语法不同。虽然对于lambda来说,字段引用不是必需的,但是永远无法完成这里的工作将是一个很大的损失。

这些只是促成这一决定的各种考虑因素中的几个。事后看来,我仍然认为我们在这里打的电话是对的。

票数 20
EN

Stack Overflow用户

发布于 2014-10-29 05:57:03

也许他们这样做是为了让C++程序员在/*中感到更受欢迎(作为怀疑论者使用的危险词汇),操作符::在静态方法上使用更自然,因为它是C++ */中的范围解析操作符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26590453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档