【问题标题】:Lambda expressions don't work in Java 8?Lambda 表达式在 Java 8 中不起作用?
【发布时间】:2012-06-25 23:26:21
【问题描述】:

我有一台运行 Windows XP SP3 32 位的虚拟机。在这台机器上 我从here 安装了 Java SE JDK 8 build b44 Developer Preview。

我还安装了 JavaFX 2.1 SDK。

效果很好:

java -version
> java version "1.8.0-ea"
> Java(TM) SE Runtime Environment (build 1.8.0-ea-b44)
> Java HotSpot(TM) Client VM (build 24.0-b14, mixed mode, sharing)

我尝试运行以下程序(取自here):

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleButtonBuilder;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class LambdasWithJavaFx extends Application
{
    public static void main(String[] args)
    {
        Application.launch(args);
    }

    @Override  public void start(Stage stage) throws Exception
    {
        BorderPane root = new BorderPane();
        ToggleButton button = new ToggleButton("Click");
        final StringProperty btnText = button.textProperty();

        button.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override public void handle(ActionEvent actionEvent)
            {
                ToggleButton source = (ToggleButton) actionEvent.getSource();
                if (source.isSelected())
                {
                    btnText.set("Clicked!");
                }
                else
                {
                    btnText.set("Click!");
                }
            }
        });

        root.setCenter(button);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setWidth(200);
        stage.setHeight(200);
        stage.show();
    }
}

程序按预期编译并运行。

我按照那篇文章中的说明将按钮事件处理代码替换为:

button.setOnAction((ActionEvent event)->
{
    ToggleButton source = (ToggleButton) event.getSource();
    if (source.isSelected())
    {
        btnText.set("Clicked!");
    }
    else
    {
        btnText.set("Click!");
    }
});

编译时出现以下错误(button.setOnAction((ActionEvent event)-&gt; 行):

> lambda expressions are not supported in -source 1.8
> (use -source 8 or higher to enable lambda expressions)

我添加了参数-source 8,没有任何改变。

我只想检查 Java 8 中的 lambda 表达式功能。为什么它不起作用?

【问题讨论】:

  • 可能实现还没有完成。你检查过发行说明吗?他们是否说 Lambdas 应该工作?无论如何,这可能是您应该与 Java 开发人员讨论的事情……使用提供的反馈渠道(无论它们是什么)。
  • @StephenC 嗯,这个版本的 JDK/JRE 8 是我能找到的最新版本(发布日期:2012 年 6 月 21 日)。我花了 20 秒才找到那个代码示例,这意味着还有更多。我认为它们应该可以工作,也许并不完美,但是......如果最重要的功能不存在,为什么还要继续发布开发者预览版?
  • 编译器抱怨你在参数中有-source 1.8。您是否编辑了该论点,或者直接“添加论点-source 8”?可能是您没有完全控制javac 命令行,所以无效参数仍然存在?
  • @SoboLAN 因为他们的预发布目标是迭代 JDK,而不是一种特定的语言特性。
  • @MarkoTopolnik 无论我是否指定 -source 8 参数,它都会给出相同的错误。

标签: java lambda javafx-2 java-8


【解决方案1】:

您需要下载包含 Lambda 表达式功能的二进制文件。尝试从这里下载http://jdk8.java.net/lambda/。 我记得在邮件列表中读到 lambda 表达式分支正在被合并到主 JDK8 构建中,但不确定它是否已经完成。但我使用来自 Lambda 项目页面的构建。

【讨论】:

  • 谢谢,我试试看。
  • 成功了,谢谢。这些版本的结构有点奇怪……为什么要发布一个带有 lambda 的 JDK 8 而一个不带 lambda?国际海事组织的额外工作。
  • 它主要是为了并行开发多个项目,然后一旦这些项目稳定,它们就会合并到主 JDK 行中。是的,这是额外的工作,但想象一下所有项目都将他们的代码合并到主线上?项目负责人和其他人管理变更只会造成混乱和困难。
  • 知道如何让它在 OS X 上运行吗?我一直在尝试使用 JDK8 lambda 分支,尽管它并不容易上手。主要的 JDK8 分支有一个 OS X 包,而 lambda 版本只是一个 tar.gz,我试着摆弄它,但它一直在崩溃。这也不是最令人愉快的安装。
  • @BrettRyan:你能更具体地谈谈你的问题吗?原则上应该很简单,因为解压缩 tar.gz 会提供一个完整的 JDK,您应该能够将您的 IDE 指向。
【解决方案2】:

作为http://jdk8.java.net/lambda/ 版本的替代品,还有来自http://jdk8.java.net/download.html 的 dmg、exe 安装程序和 tar.gz 形式的 JDK8 和 JRE8 快照版本。

这些 jdk8 开发人员快照现在还包括 lambda(和 javafx8)功能。在撰写本文时,用于 jdk8 的 lambda 和 javafx 仍处于功能和错误修复开发模式。

我发现 http://jdk8.java.net/download.html 每周构建对开发很有用(使用它们的程序偶尔会在我的 mac 上崩溃,因此即使构建的 oracle 许可证允许,您也绝对不希望将其部署到生产环境中,但他们没有)。

如果您想要绝对最新的前沿或自定义 jdk 构建,您可以使用 obuildfactory 构建您自己的。此类构建使用 OpenJDK 许可模型而不是 Oracle JDK 许可模型,这对于某些开发项目可能更可取,但就个人而言,我会尽可能坚持使用 Oracle JDK 构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 2019-01-16
    • 2017-11-16
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多