箭头运算符'->'在Java中有什么作用?


170

在搜寻一些代码时,我遇到了箭头运算符,它究竟是做什么的?我以为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();
    }
});

5
请注意,确切的情况是IntelliJ 将现有代码呈现为lambda表达式,以使其更易于阅读。实际的代码不是lambda表达式。
托尔比约恩Ravn的安徒生

Answers:


125

这是将在Java 8中引入的新lambda表达式的语法的一部分。有一些在线教程可以帮助您解决这些问题,这里是一个链接。基本上,将->参数(左侧)与实现(右侧)分开。

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

(参数)-> {主体},其中的'->'分隔参数和lambda表达式主体。

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


10
使用JDK 6的OP,所以这实际上只是IntelliJ折叠代码,按照下面的@antonm答案
Sean Landsman

6
@SeanLandsman OP可能正在使用Java 6,但在问题中他说他在其他地方遇到过该代码。至于为什么的IntelliJ没有报告错误,这是一个谜(也许还有就是在OP的系统某处安装了Java 7版)。但这是Java中lambda表达式的语法,对此毫无疑问。
奥斯卡·洛佩斯

37

当您要实现功能接口时,这一功能也很有用

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

相当于

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

为什么提供此功能?
Akaisteph19年

1
当您不想定义方法时使用@ Akaisteph7,因为您发现只有一个调用者将要调用该方法。在这种情况下,不要在单独的位置定义方法,而应将其传递给方法主体,请先阅读匿名方法,然后再输入lambda。
Vivek Shukla

30

我相信,由于您的IDE,该箭头存在。IntelliJ IDEA可以通过一些代码来完成这些工作。这称为代码折叠。您可以单击箭头将其展开。


36
@DavidConrad不,这没错。IntelliJ确实确实折叠了功能接口的内联实现,看起来像lambda。
balpha

12
看问题:“细节:Java 6,Apache Commons Collection,IntelliJ 12”在Java 6中的Lambda?
安东-M

13

这是一个lambda表达式。

这意味着,从listOfCars中,arg0是该列表的项目之一。他将要处理该项目,因此->,无论括号内是什么。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.