【问题标题】:Lambda expression in java not workingjava中的Lambda表达式不起作用
【发布时间】:2015-06-21 15:59:38
【问题描述】:

我正在尝试为 ActionListener 制作一个 lambda 表达式,但它给了我一个 IllegalStart 表达式,到目前为止我尝试运行的内容如下所示:

    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 -version 时,我给了我以下信息:

java -版本 java版本“1.8.0_45” Java(TM) SE 运行时环境 (build 1.8.0_45-b14) Java HotSpot(TM) 客户端虚拟机(build 25.45-b02,混合模式)

所以,据我所知,它有一个与 lambda 表达式兼容的版本,但没有成功地让它们工作,有什么想法或建议他会发生什么?

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

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

编辑2: 我没有使用任何IDE,我是从命令行编译的

【问题讨论】:

  • 您使用的是什么 IDE?您确定您项目的 JDK 定义为 Java 8 JDK home 吗?
  • 在您的 IDE 中,您是否将代码编译为 1.8? (在 Eclipse 中:项目属性 > java 编译器 > JDK 合规性)。无论您使用哪个 JRE 运行它,您仍然需要将其编译为 1.8。
  • @user4792574 您从与java -version 相同的终端运行命令行?
  • 另外,验证“事件”不是已定义的局部变量或当前方法参数的名称。 Lambda 参数名称在与其封闭环境相同的范围内定义。
  • @OlivierCroisier 错误将是“变量事件已定义”。

标签: java lambda


【解决方案1】:

编辑

根据您的 cmets,您没有使用任何 IDE,并且您的 javac 版本是 1.7。需要用 java 8 编译,否则无法识别 lambda。


我会将这部分保留在我的答案中,因为它可能会为其他人解决问题,即使在这种情况下这不是解决方案。

您的 lambda 非常好。该错误可能是由于编译器合规级别设置错误造成的。

如果您使用 eclipse,请参阅这篇文章了解如何更改编译器合规级别:

How to change JDK version for an Eclipse project

如果您使用 Netbeans,请记住(很多人忘记了这一点),如果您希望它正常运行,您必须将 sourcelibraries 目标都设置为 8。


来源


从命令行调用 java -version 并不意味着在 IDE 中设置了正确的库,因此您必须验证这一点。

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

【讨论】:

    【解决方案2】:

    如果您有任何机会使用 intellij,请确保项目语言级别设置为 8 - Lambdas..

    【讨论】:

      【解决方案3】:

      boton.addActionListener(event -> System.out.println("Hello World!")); - Lambda 表达式非常好。您正在将事件传递给 ActionListener 功能接口的 actionPerformed 方法,该方法将在使用 java 8 编译器编译代码时进行映射。

      请检查您的 java 版本。

      【讨论】:

        猜你喜欢
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多