67007


現在マルチスレッドを学ぶためにJavaのExecutor frameworkを勉強しています。

以下のサイトを参考したのですが、  
<https://qiita.com/koduki/items/086d42b5a3c74ed8b59e#executor-framework>

[code]

    es.execute(() -> System.out.println("executor:1, thread-id:" + Thread.currentThread().getId()));
    
[/code]

**このexecute()内で行われているアロー演算子の処理の解説が知りたいです。**

ラムダ式なのかなと思うのですが、() -> のところでどんな処理が行われているかが理解できません。

ExcutorインターフェースのAPIを見たり、ラムダ式も勉強しているのですが、一人で解決に至らなかったので質問させていただきました。よろしくお願いいたします。


CC BY-SA 4.0
2020-05-26T05:58:19.180
66996
2020-05-26T10:39:12.240
40231
question
java
ラムダ式？次のexecuteメソッドの中で行われている処理の解説が知りたい


ラムダでしょうね。[execute
メソッド](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/Executor.html#execute-
java.lang.Runnable-)に与えるのは Runnable オブジェクトなので、 **この`execute()`内** は

[code]

    new Runnable() {
        public void run() {
            System.out.println("executor:1, thread-id:" + Thread.currentThread().getId());
        }
    }
    
[/code]

の省略表記と考えればよろしいかと。

`() ->` のうち、`()` が、`Runnable()` の `()` の略。`->` の後ろが、`{}` 内のブロックです。

`()` 内のパラメーターが、`{}` ブロック内のローカル変数として利用されるということです。Runnable と run
の場合は、入力パラメーターはないので、空っぽになります。


CC BY-SA 4.0
2020-05-26T06:40:40.873
66997
2020-05-26T08:22:44.107
2020-05-26T08:22:44.107
7290
7290
66996
answer


ご自身で仰っているように、その部分は、ラムダ式です。アロー演算子というのは通称なので、ネット上で情報を探されるときには、「java
ラムダ式」で検索されると良いでしょう。私的にはかなり出来の良い日本語の解説記事も見つかったのですが、いくつか読んでみられたでしょうか?

* * *

まず、アロー(`->`)は記号の分類としては「演算子」に分類されているものの、通常の`+`なんかの演算子のように「両辺の値をもとに何かの処理を呼び出して、その結果を返す」と言うものではありません。

アローの両辺を一体として、「後で呼び出した時に、`->`の左辺の処理を実行してくれる何か」を作成して返してくれるものです。

つまり、「何かの処理を行う」と言うよりは、「処理そのものを表すオブジェクトを作ってくれる」と考えると良いでしょう。

* * *

具体的にした方が分かりやすくなるかどうかは人によるんですが、もう少し具体的なコードを匿名クラスの記法を使わずに書くと、

[code]

            es.execute(() -> System.out.println("executor:1, thread-id:" + Thread.currentThread().getId()));
    
[/code]

と言う行は、ローカルの無名クラス(以下の例では便宜上`MyRunnable`としていますが)の定義を作成してくれた上で、以下のようなコードを書いているのと等価になります。

[code]

            class MyRunnable implements Runnable {
                public void run() {
                     System.out.println("executor:1, thread-id:" + Thread.currentThread().getId());
                }
            }
    
            es.execute(new MyRunnable());
    
[/code]

`MyRunnable`のインスタンスの`run()`と言うメソッドを実行すると、`System.out.println("executor:1,
thread-id:" +
Thread.currentThread().getId())`が実行できるわけですから、これが「後で呼び出した時に、->の左辺の処理を実行してくれる何か」だと言うことになるわけです。


CC BY-SA 4.0
2020-05-26T06:54:14.670
66998
2020-05-26T06:54:14.670
13972
66996
answer


Eclipseをお使いであれば(※他のIDEでも同様の機能は[あるかもしれません](https://stackoverflow.com/a/43008829/4506703))ラムダ式と従来の無名クラスの相互変換が簡単に可能ですので、見比べて理解することができます。

ラムダ式にカーソルを合わせて  
quick fix(Windowsなら`Ctrl`+`1`) > Convert to anonymous class creation  
で、同等の処理を行う無名クラスに変換できます。

[![画像の説明をここに入力](https://i.stack.imgur.com/qYT6i.png)](https://i.stack.imgur.com/qYT6i.png)


CC BY-SA 4.0
2020-05-26T10:39:12.240
67007
2020-05-26T10:39:12.240
2808
66996
answer