Java 8中Lambda表达式无法正常工作?

15

我有一台运行Windows XP SP3 32位系统的虚拟机,在此机器上,我从此处安装了Java SE JDK 8版本为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)

我尝试运行以下程序(摘自这里):

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)->)处遇到了如下错误:

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

我添加了参数-source 8,但什么也没有改变。

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


3
也许实现还没有完全完成。你有查看发行说明吗?它们是否说Lambda应该可以工作?无论如何,这是你可能应该用提供的反馈渠道与Java开发人员讨论的事情(不管是什么)。 - Stephen C
@StephenC 嗯,这个 JDK/JRE 8 版本是我能找到的最新版本(发布日期:2012年6月21日)。而且我只用了20秒钟就找到了那段代码示例,这意味着还有很多其他的示例。我认为它们应该可以工作,也许不是完美的,但是...如果最重要的功能不存在,为什么还要继续发布开发者预览版呢? - Radu Murzea
编译器报错,指出你在参数中使用了“-source 1.8”。你是否编辑过该参数,或者是直接添加了“-source 8”这个参数?难道你没有完全控制javac命令行,导致无效的参数仍然存在吗? - Marko Topolnik
@MarkoTopolnik无论我是否指定“-source 8”参数,它都会产生相同的错误。 - Radu Murzea
我想说的是,如果你没有指定“-source 8”参数,而编译器抱怨看到“-source 1.8”,那对我来说是可疑的。就好像参数“-source 1.8”不知何故出现在命令行上一样。Java版本1.8甚至从未存在过(假设他们现在使用8作为版本)。然而,这可能只是预览版本本身的一个错误。 - Marko Topolnik
显示剩余4条评论
2个回答

28

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


它起作用了,谢谢。这些版本的结构有点奇怪...为什么要发布一个带有lambda的JDK 8和一个没有的?在我看来,这只是徒劳无功的额外工作。 - Radu Murzea
1
这主要是为了让多个项目并行开发,一旦它们稳定下来,就会合并到主 JDK 线路中。是的,这需要额外的工作,但想象一下所有项目将其代码合并到主线路上?这将只会造成混乱,并且难以管理变更的项目负责人和其他人。 - MohamedSanaulla
有没有想法如何在OS X上让这个工作?我一直在尝试使用JDK8 lambda分支,但是很难启动。主要的JDK8分支有一个OS X捆绑包,而lambda版本只是一个tar.gz文件,我试图调整它,但它总是出问题。安装也不是最愉快的事情。 - Brett Ryan
@BrettRyan:你能更具体地描述一下你的问题吗?原则上应该很简单,因为解压那个tar.gz文件会得到一个完整的JDK,你只需要将其指向你的IDE即可。 - Maurice Naftalin

2
作为 http://jdk8.java.net/lambda/ 发布的替代方案,还有以 dmg、exe 安装程序和 tar.gz 形式提供的 JDK8 和 JRE8 快照版本可在http://jdk8.java.net/download.html下载。

这些 jdk8 开发快照版本现在也包括 lambda (和 javafx8)功能。截至本文撰写时,jdk8 的 lambda 和 javafx 仍处于特性和 bug 修复开发模式中。

我发现http://jdk8.java.net/download.html每周版对开发非常有用且易用(使用它们的程序偶尔会在我的 Mac 上崩溃,因此即使 Oracle 授权使用它们部署到生产环境也不是一个好主意,而实际上 Oracle 授权并不允许这样做)。

如果您想要绝对最新的 jdk 构建或定制构建,可以使用obuildfactory自己构建。这样的构建使用的是 OpenJDK 许可模型而不是 Oracle JDK 许可模型,尽管某些开发项目可能更喜欢 OpenJDK 许可模型,但就个人而言,我会尽可能使用 Oracle JDK 构建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接