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