順次、選択、そして繰り返し

プログラミングのことやITのこと、たまに演劇のことも書きます。

Java8のラムダ式とそれに関連する知識

少し前に偶然Java8のラムダ式に遭遇したことがあった。(確かWebSocketを調べてた時)

それからラムダ式について関わることをしなかったので関わってみることにする。

ラムダ(lambda)式

関数型インターフェースのメソッドを実装するときに使用できる記述法。
ラムダ式を使用することで記述を簡略化することができる。

ん?関数型インターフェース?

関数型インターフェース

ラムダ式メソッド参照の代入先になれるインターフェースのこと。
関数型インターフェースの条件としては抽象メソッドが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メソッドではないときはインスタンス変数::メソッド名で
メソッドを参照できる。


これでラムダ式で書かれたソースも読めるようになった気がする……。

参考サイト