Ho una macchina virtuale che esegue Windows XP SP3 a 32 bit. Su questa macchina ho installato l'anteprima per sviluppatori b44 Java SE JDK 8 da here.Le espressioni lambda non funzionano in Java 8?
Ho anche installato l'SDK JavaFX 2.1.
Funziona bene:
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)
ho provato a fare funzionare il seguente programma (tratto da 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();
}
}
Il programma compilato e corse come previsto.
Ho seguito le istruzioni in questo articolo e sostituito il codice di gestione degli eventi pulsante con questa:
button.setOnAction((ActionEvent event)->
{
ToggleButton source = (ToggleButton) event.getSource();
if (source.isSelected())
{
btnText.set("Clicked!");
}
else
{
btnText.set("Click!");
}
});
Quando si compila, ottengo il seguente errore (sulla linea button.setOnAction((ActionEvent event)->
):
> lambda expressions are not supported in -source 1.8
> (use -source 8 or higher to enable lambda expressions)
Ho aggiunto l'argomento -source 8
, nulla è cambiato.
Tutto quello che volevo era controllare la funzionalità di espressioni lambda in Java 8. Perché non funziona?
Forse l'implementazione non è ancora completa. Hai controllato le note di rilascio? Dicono che Lambdas dovrebbe funzionare? Ad ogni modo, questo è qualcosa che probabilmente dovresti discutere con gli sviluppatori Java ... usando i canali di feedback forniti (qualunque essi siano). –
@StephenC Bene, questa versione di JDK/JRE 8 è l'ultima che ho trovato (data di rilascio: 21 giugno 2012). E mi ci sono voluti 20 secondi per trovare quel campione di codice, il che significa che c'è molto di più là fuori. Presumo che dovrebbero funzionare, forse non perfettamente ma ... perché continuare a rilasciare le versioni di anteprima degli sviluppatori se la funzione più importante è inesistente? –
Il compilatore si è lamentato di avere '-source 1.8' negli argomenti. Hai modificato quell'argomento, o letteralmente "aggiungi l'argomento' -source 8' "? Potrebbe essere che non hai il pieno controllo sulla riga di comando 'javac' in modo che l'argomento non valido sia ancora lì? –