Hatena::ブログ(Diary)

tomoTakaの日記

2012-12-08

OpenJDK1.8.0でLambda式をちょっと実装メモ

先週にOpenJDK1.8.0をDownloadしたので、JavaFXでも使えるか試してみました。
NetBeans7.2で新規プロジェクトとしてJavaFXアプリケーションを作成するとデフォルトで以下の画面が実装されます。
f:id:tomoTaka:20121208112152p:image:w250
画面中央の「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」を追加。
f:id:tomoTaka:20121208111940p:image
で無事にコンソール出力できました。
f:id:tomoTaka:20121208111826p:image
この時点で既に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」とおっしゃていました。
このへんになると私には?です。まだまだ勉強不足です(涙)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/tomoTaka/20121208/1354965841