2012-06-24 10 views
15

Tengo una máquina virtual que ejecuta Windows XP SP3 de 32 bits. En esta máquina instalé Java SE JDK 8 build b44 Developer Preview de here.Las expresiones Lambda no funcionan en Java 8?

También instalé JavaFX 2.1 SDK.

Funciona bien:

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) 

Me trataron de ejecutar el programa siguiente (tomado de 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(); 
    } 
} 

El programa compilado y corrieron como se esperaba.

He seguido las instrucciones en ese artículo y se sustituye el código de gestión de eventos botón con esto:

button.setOnAction((ActionEvent event)-> 
{ 
    ToggleButton source = (ToggleButton) event.getSource(); 
    if (source.isSelected()) 
    { 
     btnText.set("Clicked!"); 
    } 
    else 
    { 
     btnText.set("Click!"); 
    } 
}); 

Al compilar, me sale el siguiente error (en la línea button.setOnAction((ActionEvent event)->):

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

Agregué el argumento -source 8, nada cambió.

Todo lo que quería era comprobar la funcionalidad de las expresiones lambda en Java 8. ¿Por qué no funciona?

+3

Quizás la implementación aún no esté completa. ¿Has revisado las notas de la versión? ¿Dicen que Lambdas debería estar trabajando? De todos modos, esto es algo que probablemente deba discutir con los desarrolladores de Java ... utilizando los canales de retroalimentación proporcionados (sean lo que sean). –

+0

@StephenC Bueno, esta versión de JDK/JRE 8 es la última que pude encontrar (fecha de lanzamiento: 21 de junio de 2012). Y me tomó 20 segundos encontrar esa muestra de código, lo que significa que hay mucho más por ahí. Supongo que deberían funcionar, tal vez no perfectamente, pero ... ¿por qué seguir lanzando versiones de Developer Preview si la característica más importante es inexistente? –

+0

El compilador se quejó de que tiene '-source 1.8' en los argumentos. ¿Editó ese argumento, o literalmente "agregó el argumento' -source 8' "? ¿Podría ser que no tienes control total sobre la línea de comando 'javac' para que el argumento no válido todavía esté allí? –

Respuesta

28

Debe descargar los binarios que contienen la función de expresiones Lambda. Intente descargar desde aquí http://jdk8.java.net/lambda/. Recuerdo haber leído en la lista de correo que la rama de expresión lambda se está fusionando en la compilación principal de JDK8, pero no estoy seguro de si se ha completado. Pero utilizo la compilación de la página del proyecto Lambda.

+0

Gracias, lo intentaré. –

+0

Funcionó, gracias. La forma en que se estructuran estas versiones es un poco extraño ... ¿Por qué lanzar un JDK 8 con lambdas y otro sin él? Trabajo extra para nada OMI. –

+1

es principalmente para que varios proyectos se desarrollen en paralelo y, una vez que estos sean estables, se fusionen en la línea JDK principal. Sí, es un trabajo extra, pero ¿imagina todos los proyectos fusionando su código en la línea principal? Sería solo un caos y difícil para el líder del proyecto y otros para administrar los cambios. – MohamedSanaulla

2

Como alternativa a las versiones http://jdk8.java.net/lambda/, también hay lanzamientos de instantáneas JDK8 y JRE8 disponibles en dmg, exe installer y tar.gz desde http://jdk8.java.net/download.html.

Estas instantáneas de desarrollador jdk8 ahora también incluyen la funcionalidad lambda (y javafx8). Al escribir estas líneas, tanto lambda como javafx para jdk8 todavía están en modo de desarrollo de características y corrección de fallas.

He encontrado que las compilaciones semanales http://jdk8.java.net/download.html son útiles y utilizables para el desarrollo (los programas que las usan se bloquean ocasionalmente en mi mac, por lo que definitivamente no es algo que desee implementar en producción incluso si la licencia Oracle para las compilaciones lo permite, que no lo hacen).

Si desea las compilaciones jdk personalizadas o de última generación, puede crear las suyas propias usando obuildfactory. Tales compilaciones utilizan un modelo de licencia OpenJDK en lugar de un modelo de licencia Oracle JDK, que puede ser preferible para algunos proyectos de desarrollo, aunque, personalmente, me quedo con las compilaciones de Oracle JDK cuando puedo.