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?
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). –
@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? –
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í? –