
Java8からですが、関数を変数に代入することが可能になりました。
構文
staticメソッドの場合
1 |
変数名=クラス名::そのクラスのstaticメソッド |
インスタンスメソッドの場合
1 |
変数名 = インスタンス変数名::そのインスタンスのメソッド名 |
ただ、ここで注意点があります、代入したい関数の仕様に応じて、代入する変数の型が決まっているのです。
代入できる関数の条件
ある特定の引数と戻り値を持つ関数オブジェクトを格納できるのは、その引数と戻り値を持つメソッド宣言を含んだSAMインターフェイスのみ
SAMインターフェイス(single-abstract-method interface)
抽象メソッドを一つしか含まないインターフェイスのことです。
例えば、下記のようなインターフェイスを利用する必要があります。
抽象メソッドを一つしか含まないインターフェイス
1 2 3 4 5 |
//抽象メソッドを一つしか含まないインターフェイス public interface Sam { //抽象メソッド public abstract int sum(int a,int b); } |
使い方
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Main { public static int mainSum(int a,int b) { return a + b; } public static void main(String args[]) { Sam sam = Main::mainSum; System.out.println(sam.sum(3, 5)); } } |
実行結果
上記のように、インターフェイスSamの中の「sumメソッド」と、代入しているMainクラスの中の「mainSumメソッド」の引数と戻り値は全く同じですよね。
代入した変数から、メソッドを呼び出す際は、インターフェイスの方の名前を使うことになります。
関数を格納するための汎用SAM
上記のように、抽象メソッドを一つ持つインターフェイスを用意すれば、関数を変数に代入することができることはわかりました。
しかし、毎回インターフェイスを作成するのは少しめんどくさいですよね。そのためにJavaでは、「java.util.function」のパッケージとして汎用的なSAMが用意されています。
名前 | 引数 | 戻り値 | メソッド名 |
---|---|---|---|
IntBinaryOperator | int,int | int | applyAsInt |
IntToLongFunction | int | long | applyAsLong |
IntToDoubleFunction | int | double | applyAsDouble |
IntConsumer | int | なし | accept |
IntSupplier | なし | int | getAsInt |
IntPredicate | int | boolean | test |
この記事へのコメントはありません。