Вопрос по lambda, java-8, javafx-2, java – Лямбда-выражения не работают в Java 8?

15

У меня есть виртуальная машина под управлением Windows XP SP3 32-разрядная. На этой машине Я установил 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)

Я попытался запустить следующую программу (взят изВот):

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

Компилятор пожаловался, что у вас-source 1.8 в аргументах. Вы редактировали этот аргумент или буквально добавили аргумент?-source 8& Quot ;? Может быть, вы не имеете полного контроля надjavac командная строка, так что неверный аргумент все еще там? Marko Topolnik
Whaaaaaat? Java 8? Tharwen
@SoboLAN Поскольку их целью в предварительных выпусках является итерация по JDK, а не одна особенность языка. Dave Newton
@StephenC Ну, эта версия JDK / JRE 8 является последней, которую я смог найти (дата выпуска: 21 июня 2012 года). И мне понадобилось 20 секунд, чтобы найти этот пример кода, а это значит, что есть гораздо больше. Я предполагаю, что они должны работать, может быть, не идеально, но ... зачем выпускать версии предварительного просмотра, если самой важной функции не существует? Radu Murzea
Возможно, реализация еще не завершена. Вы проверили заметки о выпуске? Они говорят, что Лямбда должна работать? В любом случае, это то, что вы, вероятно, должны обсуждать с разработчиками Java ... используя предоставленные каналы обратной связи (какими бы они ни были). Stephen C

Ваш Ответ

2   ответа
2

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

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

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

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

28

содержащие функцию лямбда-выражений. Попробуйте скачать отсюдаhttp://jdk8.java.net/lambda/. I remember reading in the mailing list that the lambda expression branch is being merged in the main JDK8 build, but not sure if its been done. But I use the build from the Lambda project page.

В основном это так, что несколько проектов разрабатываются параллельно, а затем, когда они становятся стабильными, они объединяются в основную линию JDK. Да, это дополнительная работа, но представьте, что все проекты объединяют свой код с основной строкой? Было бы только хаосом и трудно руководителю проекта и другим управлять изменениями.
Это сработало, спасибо. Структура этих выпусков немного странная ... Зачем выпускать JDK 8 с лямбдами и без? Дополнительная работа даром ИМО. Radu Murzea
Любая идея, как заставить это работать на OS X? Я пытался использовать лямбда-ветку JDK8, хотя начать было нелегко. Основная ветка JDK8 имеет пакет OS X, в то время как лямбда-версия простоtar.gz с которым я пытался возиться, но он продолжал ломаться. Это также было не самой приятной вещью для установки.
Спасибо, я попробую. Radu Murzea
@BrettRyan: не могли бы вы рассказать о своей проблеме более конкретно? В принципе, все должно быть просто, поскольку распаковка tar.gz дает полный JDK, на который вы просто сможете указать свою IDE.

Похожие вопросы