今日のjavaおっかけ(20150511):ラムダ式 4

そしてラムダ式に戻る…!

目次とぶっつぶつテーマ

http://snoopopo.hatenablog.com/entry/2015/04/14/102732

今日のテーマ:ラムダ式 4

前回のつづき。

    //これはいく
  Consumer consumer = nameConsumer -> System.out.println(nameConsumer);

    //これはコンパイルエラー
    Runnable runnable = nameRunnable -> System.out.println(nameRunnable);

    //これはいく どこかのサンプルコードから抜粋させてもらった.
    Runnable object = () -> System.out.println("abc");

2行目はコンパイルエラーとなるのだが、3行目はならないので、これを見ていく。

これが出てきた発端というか趣旨、解消したい疑問は、 ラムダ式を使った時にどういう型が帰ってきているのか、だ。

1行目のConsumerには代入できるのに、2行目のRunnableには出来ないのもよくわからない状態なのだ。そもそもがわかってないのかもしれないけど。

そもそもの構文

http://www.ne.jp/asahi/hishidama/home/tech/java/lambda.html

おもに↑の記事を見させてもらう。

ラムダ式は、「引数部 -> 処理本体」という形式で表す。

(引数) -> {処理}

Runnableの唯一のメソッドは、以下のとおりなので、引数も戻り値もなし。

   public abstract void run();

ラムダで書くと、引数部がないということになる。

なので、2行目はコンパイルエラーになって、3行目は引数なしなので3行目はコンパイルエラーにならない。

ここまではOK。

Consumerの唯一のメソッドは、以下のとおりで、ジェネリクスのT型の引数を1つ受け取る。戻り値はなし。

   void accept(T t);

なので、一番上の例のnameConsumerといっている変数が型Tになるから、コンパイルエラーにならなかったわけか。

既にこの書きかたは型も括弧も省略して書いてしまっているので、Consumerのacceptの引数の型と認識されるみたいだ。

実行したら何も表示されなかったです!(///)

結論

ラムダの文法は,

(型 引数) -> {処理}

括弧や型は省略できるけど、僕の場合はしないほうがよさそうなので、今後は書くことにします。

戻り値の話は、今思うと、ラムダ式で定義した処理を持つ実体、っていうかインスタンスだ。

インタフェースクラス インスタンスを格納する変数 = (型 引数) -> {処理}

とりあえず、ここまでの疑問は解決なので、またStream APIに明日から戻ります。