2015-04-15 34 views
6

我tryig做了一个ActionListener拉姆达expresion,但它给我表达的IllegalStart,我试图跑这么远是这样的:Lambda表达式在java中不工作

JFrame frame = new JFrame(); 
    JButton boton = new JButton("Lambda Button"); 
    boton.addActionListener(event -> System.out.println("Hello World!")); 
    frame.add(boton); 

    frame.setVisible(true); 

在另一方面,当我使用此代码来代替:

JFrame frame = new JFrame(); 
    JButton boton = new JButton("Lambda Button"); 
    boton.addActionListener(new ActionListener() { 
           public void actionPerformed(ActionEvent e) 
           { 
            System.out.println("Hello World!"); 
           } 
           } ); 
    frame.add(boton); 
    frame.setVisible(true); 

这工作完全正常,

起初,我因子评分的问题可能是java我运行的版本,但我只是更新保持做同样的,当我做了Java的版本我给我的以下内容:

Java的版本 Java版本 “1.8.0_45” 的Java(TM)SE运行时环境(建立1.8.0_45-B14) Java的热点(TM)客户端虚拟机(建设25.45-B02,混合模式)

所以,就我所知有lambda表达式兼容,但没有赢得成功上做他们的工作,任何想法或建议版本他会发生什么?

编辑: 当我尝试编译我得到这个:

Prueba.java:57: error: illegal start of expression 
      boton.addActionListener(event -> System.out.println("Hello World !")); 
              ^1 error 

EDIT2:我没有使用任何IDE ,即时命令行

+1

你在用什么IDE?您确定项目的JDK是否定义为Java 8 JDK主页? – mtyurt

+1

在您的IDE中,您是否将代码编译为1.8? (在Eclipse中:项目属性> java编译器>符合JDK)。无论您使用哪个JRE来运行它,您仍然需要将它编译为1.8。 –

+0

我不使用任何IDE,即时通讯从命令行运行它... – user4792574

回答

9

编译编辑

根据您的意见,您没有使用任何IDE,并且您的javac版本是1.7。你需要用java 8进行编译,否则lambda不会被识别。


我会让这部分我的回答,因为它可以解决别人的问题,即使这不是在这种情况下的解决方案。

你的lambda是完美的。该错误可能是由于编译器合规性级别设置错误所致。

如果你使用Eclipse,请参阅这篇文章,了解如何更改编译器合规水平:

How to change JDK version for an Eclipse project

如果您使用NetBeans,记住(这是许多人忘记了),你必须设置如果您希望它正常工作,则sourcelibraries的目标均为8。


来源 enter image description here


enter image description here

调用的命令行java -version并不意味着正确的库中设置IDE,所以你必须验证这一点。

如果您使用任何其他IDE,然后谷歌“如何更改你的IDE上的jdk版本”

5

如果你使用的是IntelliJ任何机会,请确保项目的语言级别设置为8 - Lambda表达式..

enter image description here

2

boton.addActionListener(事件 - >的System.out.println( “你好,世界!”)); - Lambda表达式非常好。您将事件传递给ActionListener功能接口的actionPerformed方法,该接口在使用java 8编译器编译代码时将被映射。

请检查您的Java版本。

+0

我检查了我的java版本。现在它的工作 –