【问题标题】:What does the arrow operator, '->', do in Java?Java 中的箭头运算符“->”有什么作用?
【发布时间】:2013-02-15 06:21:13
【问题描述】:

在浏览一些代码时,我遇到了箭头运算符,它到底是做什么的?我以为 Java 没有箭头运算符。

return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
        return Car.SEDAN == ((Car)arg0).getStyle();
});

详细信息:Java 6、Apache Commons Collection、IntelliJ 12

更新/回答:事实证明,IntelliJ 12 支持 Java 8,它支持 lambda,并且正在“折叠”谓词并将它们显示为 lambda。下面是“展开”的代码。

return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
    public boolean evaluate(Object arg0) {
        return Car.SEDAN == ((Car)arg0).getStyle();
    }
});

【问题讨论】:

  • 请注意,确切的场景是 IntelliJ 将现有代码渲染为 lambda 表达式以使其更易于阅读。实际代码不是 lambda 表达式。

标签: java intellij-idea apache-commons java-8 apache-commons-collection


【解决方案1】:

这是新 lambda 表达式语法的一部分,将在 Java 8 中引入。有几个在线教程可以掌握它,这里有一个 link 。基本上,-&gt; 将参数(左侧)与实现(右侧)分开。

使用 lambda 表达式的一般语法是

(Parameters) -&gt; { Body }-&gt; 分隔参数和 lambda 表达式主体。

参数用括号括起来,这与方法相同,lambda 表达式主体是用大括号括起来的代码块。

【讨论】:

  • 使用 JDK 6 的 OP,所以这实际上只是 IntelliJ 折叠代码,根据下面的@antonm 回答
  • @SeanLandsman OP 可能正在使用 Java 6,但在问题中他说他在其他地方遇到了该代码。至于为什么 IntelliJ 不报告错误,这是一个谜(也许 is 在 OP 系统的某处安装了 Java 7 版本)。但这是 lambda 表达式在 Java 中的语法,这是毫无疑问的。
  • 你知道这个token类型的名字吗?
【解决方案2】:

当你想实现一个功能接口时,这个也很有用

Runnable r = ()-> System.out.print("Run method");

等价于

Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.print("Run method");
        }
};

【讨论】:

  • 为什么提供这个功能?
  • @Akaisteph7 当您不想定义方法时,因为您发现只有一个调用者会调用该方法。在这些情况下,不要在单独的地方定义方法,而是在方法体中传递,阅读匿名方法后跟 lambda 是有意义的。
  • 我怎样才能看到具体的 run() 方法被覆盖了?
  • Runnable 包含其他覆盖方法。如何具体选择 run()?
  • @Pirks - 只能在只有一种方法的接口上使用它,
【解决方案3】:

我相信,这个箭头的存在是因为你的 IDE。 IntelliJ IDEA 用一些代码来做这样的事情。这称为代码折叠。您可以单击箭头将其展开。

【讨论】:

  • @DavidConrad 不,没有错。 IntelliJ 确实将函数式接口的内联实现折叠成看起来像 lambdas。
  • 看问题:"Details: Java 6, Apache Commons Collection, IntelliJ 12" Lambda in java 6 ???
【解决方案4】:

这是一个 lambda 表达式。

这意味着,在 listOfCars 中,arg0 是该列表的项目之一。 他将要使用该项目,因此 ->,括号内的任何内容。

在本例中,他将返回符合条件的汽车列表

Car.SEDAN == ((Car)arg0).getStyle();

【讨论】:

    【解决方案5】:

    Java 8 中添加的新运算符用于 lambda 表达式

    Lambda 表达式是编写方法的简短方式。
    间接用于实现functional interface

    主要语法:(参数)-> { 语句; }

    您应该知道一些基本的rules for effective lambda expressions writting

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多