lambda
Java8の機能の1つで関数型プログラミングを行うために導入され、Android Studio 2.4 辺りから使えるようになりました。
何がメリットかと言うと、匿名クラスの記述を簡略化できることでしょう。
逆に簡略化されて入門者は理解しずらいとも思います
ただ関数型プログラミングはバグを減らすために有効とされているので避けて通れないところです。
lambda変換
ラムダ式は、関数型インタフェースのメソッドの、1つの抽象メソッドしか持たないインターフェースに使用できます。
アロー演算子「->」を使い (引数,引数,…) -> {何かの処理} という書き方ができるもの
具体的に Button の実装で見て見ると、
1 2 3 4 5 6 7 |
Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.v("log","test"); } }); |
このように記述すると最近のAndroid Studioではwarningが出てきます
Android Studio 上でこれにマウスをかざすとRecomendationが現れます
new View.OnClickListener()をlambdaに置き換えられるというので
「Alt+Shitf+Enter」を実行するとlambda式に変更されました。
あるいは「Replace with kambda」をクリック
1 2 3 4 |
Button button = findViewById(R.id.button); button.setOnClickListener(v -> { Log.v("log","test"); }); |
省略手順
setOnClickListener()は引数にOnClickListenerというインターフェースをとります
OnClickListenerは、onClick()という抽象メソッドが1つだけ定義されたインターフェースであり、onClick()が必ず呼ばれるため省略できるわけです。
1 2 3 |
public interface OnClickListener { void onClick(View v); } |
アロー演算子「->」を使って簡略化すると、
1 2 3 |
button.setOnClickListener((View v) -> { Log.v("log","test"); }); |
更に、引数の型も省略でき、引数が1つであれば()も省略できるので
1 2 3 4 |
Button button = findViewById(R.id.button); button.setOnClickListener(v -> { Log.v("log","test"); }); |
といった記述になります。
ここまでは statement lambda ですが、更に
expression lambda にすることもできます。
1 2 |
Button button = findViewById(R.id.button); button.setOnClickListener(v -> Log.v("log","test")); |
2行になってしまいました。
Java関連ではもっと詳しく解説されています