Java の「関数型インターフェース」とは抽象メソッドが1つだけの抽象クラスのことで、これを使って定義した変数には関数をオブジェクト化した「関数オブジェクト」を代入出来ます。
と言っても良く分からないと思うので、ソースコードを見ながら具体的に使い方を説明します。
なおこの関数型インターフェースには様々な種類がありますが、今回は「Runnable」と「Function」インターフェースについて説明します。
まず前提として、
・ Runnable インターフェースを使って定義した変数には「引数を持たない void 型の関数オブジェクト」を代入できます。
・ Function インターフェースを使って定義した変数には「引数が1つで戻り値を持つ関数オブジェクト」を代入できます。
例えば、Runnable インターフェースの変数 runnable と、引数が Integer 型、戻り値が String 型である Function インターフェースの変数 function はソース 1 のようにして定義します。 なお Runnable インターフェースを使いたい時は java.lang.Runnable を、Funtion インターフェースを使いたい時は java.util.function.Function をインポートします。
import java.lang.Runnable; import java.util.function.Function; public class Main{ public static void main(String[] args) { Runnable runnable; Function< Integer, String > function; } }
この様にして作った runnable や function には、次のソース 2 の様にして関数を代入できます。
import java.lang.Runnable; import java.util.function.Function; public class Main{ public static void myrunnable(){ System.out.println("hoge"); } public static String myfunction( Integer a ){ return "piyo="+a; } public static void main(String[] args) { Runnable runnable; Function< Integer, String > function; runnable = Main::myrunnable; function = Main::myfunction; } }
上の例では runnable と function にそれぞれ myrunnable 関数と myfunction 関数を代入しています。
すると runnable と function を経由して次のソース 3 の様に myrunnable 関数と myfunction 関数を呼び出す事が出来ます。
import java.lang.Runnable; import java.util.function.Function; public class Main{ public static void myrunnable(){ System.out.println("hoge"); } public static String myfunction( Integer a ){ return "piyo="+a; } public static void main(String[] args) { Runnable runnable; Function< Integer, String > function; runnable = Main::myrunnable; function = Main::myfunction; runnable.run(); // myrunnable 関数の呼び出し String str = function.apply( 123 ); // myfunctionの呼び出し(引数は123) System.out.println( str ); } }
runnable に代入した関数を呼び出す時は Runnable.run メソッドを使います。
また function に代入した関数を呼び出す時は Function.apply メソッドを使います。
したがって上のソース3の結果は以下となります。
hoge piyo=123
なお、代入する関数はコードの途中で切り替えることも可能です。
例えば次のソース4の様なコードを書くことも出来ます。
import java.lang.Runnable; public class Main{ public static void myrunnable1(){ System.out.println("hoge"); } public static void myrunnable2(){ System.out.println("fuga"); } public static void myrunnable3(){ System.out.println("piyo"); } public static void main(String[] args) { Runnable runnable; runnable = Main::myrunnable1; runnable.run(); runnable = Main::myrunnable2; // 関数オブジェクトを再代入 runnable.run(); runnable = Main::myrunnable3; // 関数オブジェクトを再代入 runnable.run(); } }
hoge fuga piyo