2012-06-24 19 views
15

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?

+3

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). –

+0

@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? –

+0

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ì? –

risposta

28

È necessario scaricare i file binari che contengono la funzione di espressioni Lambda. Prova a scaricare da qui http://jdk8.java.net/lambda/. Ricordo di aver letto nella mailing list che il ramo di espressione lambda è stato fuso nel build principale di JDK8, ma non è sicuro che sia stato fatto. Ma io uso la build dalla pagina del progetto Lambda.

+0

Grazie, farò un tentativo. –

+0

Ha funzionato, grazie. Il modo in cui queste versioni sono strutturate è un po 'strano ... Perché rilasciare un JDK 8 con lambdas e uno senza? Lavoro extra per niente IMO. –

+1

è principalmente così che più progetti vengono sviluppati in parallelo e poi, una volta che questi sono stabili, vengono uniti nella linea principale JDK. Sì, è un lavoro extra, ma immagina tutti i progetti che uniscono il loro codice alla linea principale? Sarebbe solo il caos e difficile per il lead del progetto e gli altri per gestire i cambiamenti. – MohamedSanaulla

2

In alternativa alle versioni http://jdk8.java.net/lambda/, sono disponibili anche le versioni di snapshot JDK8 e JRE8 disponibili in dmg, exe installer e tar.gz da http://jdk8.java.net/download.html.

Queste istantanee sviluppatore jdk8 ora includono anche funzionalità lambda (e javafx8). Al momento della stesura di questo documento, sia lambda che javafx per jdk8 sono ancora in modalità sviluppo e correzione bug.

Ho trovato le build settimanali http://jdk8.java.net/download.html utili e utilizzabili per lo sviluppo (i programmi che li utilizzano si guastano occasionalmente sul mio Mac, quindi non è sicuramente qualcosa che si vorrebbe distribuire in produzione anche se la licenza Oracle per le build lo permettesse, che non lo fanno).

Se si desidera l'ultimo bleeding edge o le build personalizzate di jdk, è possibile crearne uno utilizzando obuildfactory. Tali build utilizzano un modello di licenza OpenJDK piuttosto che un modello di licenza JDK Oracle, che potrebbe essere preferibile per alcuni progetti di sviluppo, anche se, personalmente, mantengo le build di Oracle JDK quando posso.

Problemi correlati