Java 中的箭头运算符“->”有啥作用?

Posted

技术标签:

【中文标题】Java 中的箭头运算符“->”有啥作用?【英文标题】: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 表达式。 【参考方案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。

【讨论】:

以上是关于Java 中的箭头运算符“->”有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

Java和JavaScript中的运算符>>>有啥区别?

^= 运算符有啥作用?

HTML里的meta标签有啥作用?怎么用?六安市康运有人会这个吗?

插入符号 (^) 运算符有啥作用?

一元问号 (?) 运算符有啥作用?

Perl 中的 ^ 运算符有啥作用?