Подтвердить что ты не робот

Лямбда-выражения не работают в Java 8?

У меня есть виртуальная машина с 32-разрядной версией Windows XP SP3. На этой машине Я установил Java Developer JDK 8 build b44 Developer Preview из здесь.

Я также установил SDK JavaFX 2.1.

Он отлично работает:

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. Почему это не работает?

4b9b3361

Ответ 1

Вам нужно загрузить двоичные файлы, которые содержат функцию Lambda expressions. Попробуйте скачать здесь http://jdk8.java.net/lambda/. Я помню, как читал в списке рассылки, что ветвь выражения лямбда объединяется в основную сборку JDK8, но не уверен, что она выполнена. Но я использую сборку на странице проекта Lambda.

Ответ 2

В качестве альтернативы выпускам http://jdk8.java.net/lambda/ есть также выпуски моментальных снимков JDK8 и JRE8, доступные в dmg, exe installer и tar.gz form from http://jdk8.java.net/download.html.

Эти снимки разработчиков jdk8 теперь также включают функции lambda (и javafx8). На момент написания этой статьи, как lambda, так и javafx для jdk8 все еще находятся в режиме разработки исправления ошибок и ошибок.

Я обнаружил, что http://jdk8.java.net/download.html еженедельно строит полезную и полезную для разработки (программы, использующие их, будут иногда рушиться на моем mac, так что это определенно не то, что вы хотели бы развернуть на производство, даже если лицензия oracle для сборки разрешила то, что у них нет).

Если вам нужен абсолютный последний край кровотечения или настраиваемые сборки jdk, вы можете создать свой собственный, используя obuildfactory. Такие сборки используют модель лицензирования OpenJDK, а не модель лицензирования Oracle JDK, которая может быть предпочтительной для некоторых проектов разработки, хотя лично я придерживаюсь сборки Oracle JDK, когда могу.