2012-06-24 49 views
15

Tôi có một máy ảo chạy Windows XP SP3 32 bit. Trên máy này Tôi đã cài đặt Java SE JDK 8 build b44 Developer Preview từ here.Biểu thức Lambda không hoạt động trong Java 8?

Tôi cũng đã cài đặt JavaFX 2.1 SDK.

Nó hoạt động tốt:

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) 

Tôi cố gắng chạy chương trình sau (lấy từ 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(); 
    } 
} 

Chương trình biên dịch và chạy như mong đợi.

Tôi làm theo các hướng dẫn trong bài viết đó và thay thế nút mã sự kiện xử lý với điều này:

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

Khi biên dịch, tôi nhận được lỗi sau (trên dòng button.setOnAction((ActionEvent event)->):

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

Tôi đã thêm đối số -source 8, không có gì thay đổi.

Tất cả những gì tôi muốn là kiểm tra chức năng biểu thức lambda trong Java 8. Tại sao nó không hoạt động?

+3

Có thể triển khai chưa hoàn tất. Bạn đã kiểm tra ghi chú phát hành chưa? Họ có nói rằng Lambdas nên làm việc không? Dù sao, đây là một cái gì đó bạn có lẽ nên thảo luận với các nhà phát triển Java ... bằng cách sử dụng các kênh phản hồi được cung cấp (bất kể chúng là gì). –

+0

@StephenC Vâng, phiên bản JDK/JRE 8 này là phiên bản mới nhất tôi có thể tìm thấy (ngày phát hành: 21 tháng 6 năm 2012). Và tôi mất 20 giây để tìm mẫu mã đó, điều đó có nghĩa là có nhiều hơn ở đó. Tôi cho rằng họ nên làm việc, có thể không hoàn hảo nhưng ... tại sao tiếp tục phát hành phiên bản Preview Preview nếu tính năng quan trọng nhất là không tồn tại? –

+0

Trình biên dịch phàn nàn rằng bạn có '-source 1.8' trong các đối số. Bạn đã chỉnh sửa đối số đó hay nghĩa đen là "thêm đối số' -source 8' "? Có thể là bạn không có toàn quyền kiểm soát dòng lệnh 'javac' để đối số không hợp lệ vẫn còn đó? –

Trả lời

28

Bạn cần tải xuống các tệp nhị phân có chứa tính năng biểu thức Lambda. Thử tải xuống từ đây http://jdk8.java.net/lambda/. Tôi nhớ đọc trong danh sách gửi thư rằng chi nhánh biểu thức lambda đang được sáp nhập trong bản xây dựng chính của JDK8, nhưng không chắc chắn nếu nó được thực hiện. Nhưng tôi sử dụng xây dựng từ trang dự án Lambda.

+0

Cảm ơn, tôi sẽ thử. –

+0

Nó hoạt động, cảm ơn bạn. Cách thức các bản phát hành này được cấu trúc hơi lạ ... Tại sao phát hành một JDK 8 với lambdas và một không có? Công việc bổ sung cho IMO không có gì. –

+1

của nó chủ yếu là do đó nhiều dự án được phát triển song song và sau đó một khi chúng được ổn định, chúng được sáp nhập vào dòng JDK chính. Có thêm công việc của nó, nhưng hãy tưởng tượng tất cả các dự án sáp nhập mã của họ vào dòng chính? Nó sẽ chỉ là sự hỗn loạn và khó khăn cho người dẫn dắt dự án và những người khác để quản lý những thay đổi. – MohamedSanaulla

2

Là một giải pháp thay thế cho bản phát hành http://jdk8.java.net/lambda/, cũng có các bản phát hành chụp nhanh JDK8 và JRE8 có sẵn trong dmg, trình cài đặt exe và biểu mẫu tar.gz từ http://jdk8.java.net/download.html.

Các ảnh chụp nhanh dành cho nhà phát triển jdk8 này hiện cũng bao gồm chức năng lambda (và javafx8). Theo văn bản này, cả lambda và javafx cho jdk8 vẫn còn trong tính năng và sửa lỗi chế độ phát triển.

Tôi đã tìm thấy các công cụ xây dựng hàng tuần hữu ích và có thể sử dụng được (các chương trình sử dụng chúng thỉnh thoảng sẽ bị lỗi trên máy Mac của tôi, vì vậy nó chắc chắn không phải là thứ bạn muốn triển khai để sản xuất ngay cả khi giấy phép oracle cho phép xây dựng cho phép, mà họ không).

Nếu bạn muốn cạnh chảy máu tuyệt đối mới nhất hoặc bản dựng jdk tùy chỉnh, bạn có thể tự xây dựng bằng cách sử dụng obuildfactory. Các bản dựng như vậy sử dụng mô hình cấp phép OpenJDK thay vì mô hình cấp phép Oracle JDK, có thể thích hợp hơn cho một số dự án phát triển, tuy nhiên, tôi gắn bó với Oracle JDK khi tôi có thể.

Các vấn đề liên quan