2012-06-24 5 views
15

Windows XP SP3 32 비트를 실행하는 가상 컴퓨터가 있습니다. 이 컴퓨터에서 here에서 Java SE JDK 8 빌드 b44 개발자 미리보기를 설치했습니다.람다식이 Java 8에서 작동하지 않습니까?

JavaFX 2.1 SDK도 설치했습니다.

그것은 잘 작동 :

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) 

내가 (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(); 
    } 
} 

프로그램을 예상대로 달렸다.

는 그 문서의 지침을 따라이있는 버튼 이벤트 처리 코드 교체 :

> lambda expressions are not supported in -source 1.8 
> (use -source 8 or higher to enable lambda expressions) 
: 컴파일 할 때

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

, 나는 (라인 button.setOnAction((ActionEvent event)->에) 다음과 같은 오류를

-source 8 인수를 추가했지만 아무 것도 변경되지 않았습니다.

Java 8의 람다 식 기능을 확인하고 싶었던 이유는 무엇입니까?

+3

아마도 구현이 아직 완료되지 않았을 수 있습니다. 릴리스 정보를 확인 했습니까? 람다가 일해야한다고 말하는가? 어쨌든, 이것은 자바 개발자와 논의해야 할 것입니다 ... 제공된 피드백 채널을 사용합니다 (그들이 무엇이든간에). –

+0

@StephenC 글쎄, 이번 버전의 JDK/JRE 8은 내가 발견 할 수있는 최신 버전이다 (출시일 : 2012 년 6 월 21 일). 그리고 그 코드 샘플을 찾는 데 20 초가 걸렸습니다. 즉, 더 많은 코드 샘플이 있음을 의미합니다. 필자는 완벽하게 작동하지 않을 것이라고 생각하지만 가장 중요한 기능이 존재하지 않는 이유는 무엇입니까? –

+0

컴파일러는 인수에'-source 1.8'이 있다고 불평했습니다. 이 인수를 편집 했습니까? 아니면 "-source 8' 인수를 추가 했습니까? 유효하지 않은 인자가 여전히 존재하도록'javac' 명령 행을 완전히 제어 할 수 없습니까? –

답변

28

람다 식 기능이 포함 된 바이너리를 다운로드해야합니다. 여기에서 다운로드하십시오. http://jdk8.java.net/lambda/ 메일 링리스트에서 람다 식 브랜치가 기본 JDK8 빌드에서 병합되고 있지만 완료되었는지는 확실하지 않습니다. 하지만 Lambda 프로젝트 페이지의 빌드를 사용합니다.

+0

고마워, 나는 그것을 시도 할 것이다. –

+0

감사합니다. 이 릴리스의 구조는 조금 이상합니다 ... JDK 8을 람다와 하나없이 배포하는 이유는 무엇입니까? IMO를위한 추가 작업. –

+1

그 대부분은 여러 프로젝트를 병렬로 개발 한 다음 안정화되면 주 JDK 라인에 병합됩니다. 그렇습니다. 추가 작업은 있지만 모든 프로젝트가 코드를 메인 라인에 병합한다고 상상해보십시오. 프로젝트 리드 나 다른 사람들이 변경 사항을 관리하는 것은 혼란과 어려움 일뿐입니다. – MohamedSanaulla

2

http://jdk8.java.net/lambda/ 릴리스에 대한 대안으로 dmg, exe installer 및 tar.gz 양식에서 사용할 수있는 JDK8 및 JRE8 스냅 샷 릴리즈가 http://jdk8.java.net/download.html에서 있습니다.

이러한 jdk8 개발자 스냅 샷에는 이제 람다 (및 javafx8) 기능이 포함됩니다. 이 글을 쓰는 시점에서 jdk8 용 lambda와 javafx는 여전히 기능 및 버그 수정 개발 모드에 있습니다.

주간 빌드를 유용하고 유용하게 사용할 수있는 주간 빌드를 찾았습니다. (사용하는 프로그램이 가끔 내 Mac에서 충돌하기 때문에 빌드의 오라클 라이센스가이를 허용하더라도 프로덕션에 배포하려는 것이 아닙니다. 그들은 그렇지 않다).

가장 최신 출혈 가장자리 또는 사용자 지정된 jdk 빌드를 원할 경우 obuildfactory을 사용하여 직접 빌드 할 수 있습니다. 이러한 빌드는 Oracle JDK 라이센스 모델이 아닌 OpenJDK 라이센스 모델을 사용합니다. 일부 모델의 경우 개발 프로젝트에서 바람직 할 수 있습니다. 개인적으로 필자는 Oracle JDK 빌드를 사용합니다.

관련 문제