OpenJDK1.8.0でLambda式をちょっと実装メモ
先週にOpenJDK1.8.0をDownloadしたので、JavaFXでも使えるか試してみました。
NetBeans7.2で新規プロジェクトとしてJavaFXアプリケーションを作成するとデフォルトで以下の画面が実装されます。
画面中央の「say Hello World」ボタンをクリックするとコンソールに「Hello World」と出力されます。
このボタンクリック時の「setOnAction」部分がLambda式で書けました。
出力するメッセージを「Hello Lambda」にして引数のActionEventも出力してみました。
package test; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class HelloJavaFX extends Application { @Override public void start(Stage stage) { // NetBeansで作成される実装 Button btn = new Button(); btn.setText("say 'Hello World'"); btn.setOnAction(new EventHandler<ActionEvent>(){ @Override public void handle(ActionEvent event) { System.out.println("Hello world!"); } }); // Lambda 式で実装 Button btn2 = new Button(); btn2.setText("say Hello World(Lambda)"); btn2.setOnAction(e -> System.out.println("Hello Lambda " + e)); // ★ここです StackPane root = new StackPane(); root.getChildren().addAll(btn2); Scene scene = new Scene(root, 300, 250); stage.setTitle("Hello WOrld"); stage.setScene(scene); stage.show(); } public static void main(String... arg) { launch(arg); } }
画面は、同じです。ボタンの文字に「Lambda」を追加。
で無事にコンソール出力できました。
この時点で既にJavaFXでlambda式が書けることに驚いています。
コンパイル、実行は前回のFirst Lambda - tomoTakaの日記と同じ方法です。
でJavapしてみた結果です。
Compiled from "HelloJavaFX.java" public class test.HelloJavaFX extends javafx.application.Application { public test.HelloJavaFX(); Code: 0: aload_0 1: invokespecial #1 // Method javafx/application/Application."<init>":()V 4: return public void start(javafx.stage.Stage); Code: 0: new #2 // class javafx/scene/control/Button 3: dup 4: invokespecial #3 // Method javafx/scene/control/Button."<init>":()V 7: astore_2 8: aload_2 9: ldc #4 // String say 'Hello World' 11: invokevirtual #5 // Method javafx/scene/control/Button.setText:(Ljava/lang/String;)V 14: aload_2 15: new #6 // class test/HelloJavaFX$1 18: dup 19: aload_0 20: invokespecial #7 // Method test/HelloJavaFX$1."<init>":(Ltest/HelloJavaFX;)V 23: invokevirtual #8 // Method javafx/scene/control/Button.setOnAction:(Ljavafx/event/EventHandler;)V 26: new #2 // class javafx/scene/control/Button 29: dup 30: invokespecial #3 // Method javafx/scene/control/Button."<init>":()V 33: astore_3 34: aload_3 35: ldc #9 // String say Hello World(Lambda) 37: invokevirtual #5 // Method javafx/scene/control/Button.setText:(Ljava/lang/String;)V 40: aload_3 41: invokedynamic #10, 0 // InvokeDynamic #0:lambda:()Ljavafx/event/EventHandler; 46: invokevirtual #8 // Method javafx/scene/control/Button.setOnAction:(Ljavafx/event/EventHandler;)V 49: new #11 // class javafx/scene/layout/StackPane 52: dup 53: invokespecial #12 // Method javafx/scene/layout/StackPane."<init>":()V 56: astore 4 58: aload 4 60: invokevirtual #13 // Method javafx/scene/layout/StackPane.getChildren:()Ljavafx/collections/ObservableList; 63: iconst_1 64: anewarray #14 // class javafx/scene/Node 67: dup 68: iconst_0 69: aload_3 70: aastore 71: invokeinterface #15, 2 // InterfaceMethod javafx/collections/ObservableList.addAll:([Ljava/lang/Object;)Z 76: pop 77: new #16 // class javafx/scene/Scene 80: dup 81: aload 4 83: ldc2_w #17 // double 300.0d 86: ldc2_w #19 // double 250.0d 89: invokespecial #21 // Method javafx/scene/Scene."<init>":(Ljavafx/scene/Parent;DD)V 92: astore 5 94: aload_1 95: ldc #22 // String Hello WOrld 97: invokevirtual #23 // Method javafx/stage/Stage.setTitle:(Ljava/lang/String;)V 100: aload_1 101: aload 5 103: invokevirtual #24 // Method javafx/stage/Stage.setScene:(Ljavafx/scene/Scene;)V 106: aload_1 107: invokevirtual #25 // Method javafx/stage/Stage.show:()V 110: return public static void main(java.lang.String...); Code: 0: aload_0 1: invokestatic #26 // Method launch:([Ljava/lang/String;)V 4: return }
41行目のLambda式のところで「invokedynamic」の文字が、、、
先週の関西Java Special でid:skrbさんが確か「invokeDynamic」とおっしゃていました。
このへんになると私には?です。まだまだ勉強不足です(涙)