Java8のラムダ式とそれに関連する知識
少し前に偶然Java8のラムダ式に遭遇したことがあった。(確かWebSocketを調べてた時)
それからラムダ式について関わることをしなかったので関わってみることにする。
関数型インターフェース
ラムダ式やメソッド参照の代入先になれるインターフェースのこと。
関数型インターフェースの条件としては抽象メソッドが1つだけある
インターフェースであること。
(staticメソッドやデフォルトメソッドが含まれていてもOK)
※ちなみにデフォルトメソッドはインターフェースの中にある抽象メソッドではない
メソッドのこと……らしい。(処理が実装されている)
ん?メソッド参照?
メソッド参照
関数型インターフェースの変数にメソッドそのものを代入すること。
ラムダ式を調べようとするだけで芋づる式のように関数型インターフェースと
メソッド参照というキーワードが出てきてしまった。
出てきたしまった以上仕方がないので実際にソースコードを書いてみる。
まずは関数型インターフェースから
package lambda.java; //関数型インターフェースとは //1.定義されている抽象メソッドが1つしかないインターフェース //2.ラムダ式やメソッドの参照の代入先になれるインターフェース @FunctionalInterface public interface TestFunction { public abstract int apply(int a, int b, int c); }
アノテーションで@FunctionalInterfaceを付加すると関数型インターフェースと認識するらしい。
そしてラムダ式。
package lambda.java; public class Lambda { public static void main(String[] args) { //ラムダ式 //3つのint型引数を左から順に引き算して答えを返す TestFunction testFunction = (a,b,c) -> a - b - c; //答えを標準出力 System.out.println(testFunction.apply(50, 30, 10)); } }
とりあえずここに注目。
//ラムダ式 //3つのint型引数を左から順に引き算して答えを返す TestFunction testFunction = (a,b,c) -> a - b - c;
Testfunctionというインターフェースにはapplyという3つのint型引数があるので
(a,b,c)と書いて->の先に実際の処理を書く。
これでapplyメソッドの実装が済んでいるので
//答えを標準出力 System.out.println(testFunction.apply(50, 30, 10));
applyメソッドを呼び出すと引き算した結果を出力してくれる。
次にメソッド参照。
package lambda.java; public class TestClass { //staticメソッド 3つの引数を足した結果を返す public static int sum(int a, int b, int c){ return a + b + c; } }
package lambda.java; public class Lambda { public static void main(String[] args) { //メソッド参照 //TestClassクラスのsumメソッドを参照している TestFunction testFunction = TestClass::sum; System.out.println(testFunction.apply(50, 30, 10)); } }
とりあえずここに注目。
//メソッド参照 //TestClassクラスのsumメソッドを参照している TestFunction testFunction = TestClass::sum;
"::"がポイント
クラス名::メソッド名と書くことで指定したクラスのメソッドを
参照することができる。
staticメソッドではないときはインスタンス変数::メソッド名で
メソッドを参照できる。
これでラムダ式で書かれたソースも読めるようになった気がする……。
参考サイト