ラムダ式

今更ですがラムダ式です。
よく質問されるものの一つ。

まあ、他のブログでもいろいろ取り上げられてるものの
備忘録的な感じでここに書いておくこともアリかなと。

ちなみに、ここでも書いてるけどAndroidでもretrolambdaを使うことでラムダ式は使えます。

まず、ラムダ式はFunctionalInterfaceを対象に、インスタンスの生成を省略して書けるものです。
ちなみに、FunctionalInterfaceはメソッドが一つしか定義されていないインタフェースのことです。
java8からは@FunctionalInterfaceをつけることができますが、つけなくてもラムダ式として使えます。

抽象クラスはラムダ式として使えないのでご注意を…

FunctionalInterface

メソッドが一つだけのインタフェースの事を指します。
例で言うと下のやつですね。
返り値・引数の数/型に制限はありません。
当然、ジェネリックも使えます。

 

ラムダ式

さっき記述したやつを、ラムダ式にしてみます。
まずは、返り値固定・引数なしの場合。

返り値固定・引数なしの場合

Interface

実行側

この組み合わせで実装があった場合、Interfaceを代入する場合、こうなります。

めんどくさいw

これをラムダ式に変えてみます。

ちょっとスッキリ!
今回は引数がないので、() -> {} という記述の方法になってます。
() が引数部分で、{}が実装部分を指しています。
アロー演算子を使うことでnewの部分と、メソッドのオーバライドを省略しています。

で、実装部分が1行で書ける場合は更に省略ができます。

実際にはresult()をわざわざ作らなくても良かったけど、
() -> 1 だと見栄えが良くないので作りましたw

とりあえず、返り値固定・引数なしの場合はこれでできます。

返り値がgeneric/引数が一つの場合

Interface

実行側

今回はジェネリックをLongで指定しています。
こいつをラムダ式を使わずに呼ぶと…

まあ、こうなります。
ジェネリックはメソッドのやつと合わせて、newとオーバライド書いて…
面倒…

この場合もちゃんとラムダ使えます!

一発!
しかも、引数が一個の時にだけ引数側の()を省略できる!
かなりスッキリしますね。

返り値がジェネリック・引数がintとジェネリックの場合

interface

実行側

返り値・引数両方にLongを指定しています。
まあ、面倒w

これをラムダ式にすると…

一行!
かなりスッキリ!

最初は気持ち悪かったり書きにくかったりするものの、
慣れるとラムダ式じゃないと使いにくくなりますw
まあ、行数がかなり減らせるので可読性も上がります。

ただ、java6/7から入ってきた人にとってはちょっとしんどいかも。
ちなみにstreamを使うにはラムダが使えないとキツイっす!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.