そしてラムダ式に戻る…!
目次とぶっつぶつテーマ
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に明日から戻ります。