質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2246閲覧

Javaのコードの書き方の意味がわからない

ryohasegawa

総合スコア437

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/06/24 10:44

編集2017/06/24 10:56

軽Labのサイトで載っているコードなんですが、

Java

1// 再生ボタンにイベントを登録 2 EventHandler<ActionEvent> playHandler = ( e ) -> 3 { 4 // 再生開始 5 mp.play(); 6 }; 7 playButton.addEventHandler( ActionEvent.ACTION , playHandler );

というこのような書き方がわかりません。
EventHandler<ActionEvent> playHandler = ( e ) ->これはどういう意味があるのですか?
またその下の行のaddEventHandler( ActionEvent.ACTION , playHandler )では何をしているのですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ラムダ式という記法ですが、これを理解するためには、まず匿名クラスについて理解しなければいけません。
###通常のクラス
あるクラスを継承、またはあるインタフェースを実装したクラスを作成する場合、
普通は新たにclass宣言し、クラスを作成します。
ここでは例としてRunnableを実装したMyRunnableというクラスを作成します。Runnableは抽象メソッドrunを持っているので、抽象クラスとして宣言しないためにはrunメソッドを実装する必要がありますので、"test"と出力するように実装しましょう。

java

1class MyRunnable implements Runnable { 2 @Override 3 public void run() { 4 System.out.println("test"); 5 } 6}

こうして、このクラスを使用する場合、

java

1Runnable r = new MyRunnable();

のようにして使うことができます。
###匿名クラス
しかし、このクラスをこの1か所でしか使用しないならば、この1か所のためだけにクラスを宣言するのが面倒です。そこで、その場所だけで使うクラスをその場で作成し、インスタンスを作成しようというのが次の匿名クラスという仕組みです。

java

1Runnable r = new Runnable(){ 2 @Override 3 public void run() { 4 System.out.println("test"); 5 } 6};

やっていることは上記MyRunnableを使用しているものとほとんど変わりありません。異なるのはMyRunnableというクラス名を使用していないという点です。クラス名をつけずにクラスを作成しているため、匿名クラスと呼ばれています。
###ラムダ式
この匿名クラスを、特定条件下でもっと簡略化して書くことができる仕組みがラムダ式です。特定条件とは、
0. 関数型インタフェースを実装したものである
0. 実装したインタフェースの唯一の抽象メソッドをオーバーライドする以外、何も記述しない
(フィールドの宣言などもNG)

これらになります。関数型インタフェースとは、抽象メソッドを1つだけ持つインタフェースです。Java8になってインタフェースがdefault実装やstaticメソッドを持つことができるようになりましたが、それらは抽象メソッドにカウントしません。
ラムダ式は、関数型インタフェースが持つ唯一のメソッドをオーバーライドする中身を記述します。オーバーライドする対象のメソッドが1つしかないため、メソッド名も引数型も返り値型も確定しているので、それらを省略した書き方ができます。上記の例をラムダ式で書くと次のようになります。

java

1Runnable r = () -> System.out.println("test");

投稿2017/06/24 15:22

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ラムダ式ですね。
一回しか使わないメソッドを、いちいち宣言しないで使うことができ有用です。

EventHandler<ActionEvent> playHandlerと変数を宣言して、
そこに( e ) -> { mp.play(); }というラムダ式を代入しているのです。

この( e )は関数の引数ですが、使わないので無視されていますね。

addEventHandlerでは、「ActionEvent.ACTIONが発生したら、playHandlerを呼び出しますよ」という登録をしています。

投稿2017/06/24 10:57

編集2017/06/24 11:01
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryohasegawa

2017/06/24 10:59

EventHandler<ActionEvent> playHandler = ( e ) -> というのがラムダ式ですか?
LouiS0616

2017/06/24 11:02

追記しました。=以降が複雑なだけで、していることは普通の代入です。 ( e )... 以降がラムダ式です。
ryohasegawa

2017/06/24 11:06

EventHandler<ActionEvent> これは、int みたいなものですか? で、playHandler は 変数(i や y)みたいなものですか?
LouiS0616

2017/06/24 11:08

その解釈で合っていると思います。
ryohasegawa

2017/06/24 11:13

EventHandler<ActionEvent> はどのような意味ですか?
ryohasegawa

2017/06/24 11:21

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問