JAVA 関数オブジェクトの代入



■変数へのメソッド参照の格納
メソッドがstaticの場合
変数名 = クラス名 :: そのクラスの静的メソッド名
メソッドが非staticの場合
変数名 = インスタンス変数名 :: そのインスタンスのメソッド名


■関数オブジェクトを格納可能な型
ある特定の引数と戻り値を持つ関数オブジェクトを格納できるのは、
その引数と戻り値を持つメソッド宣言を含んだSAMインタフェースの型

SAMインタフェースとは、
抽象メソッドを1つしか含まないインタフェースのこと

IntBinaryOperator

java.util.function.IntBinaryOperatorとは

public interface IntBinaryOperator {
    public abstract int applyAsInt(int left, int right);
}

▪️Test76.java メソッドがstaticの場合 例

import java.util.function.IntBinaryOperator;

public class Test76 {
    public static int sub(int a, int b) {
        return a - b;
    }

    public static int cal(int x, int b) {
        x *= 2;// 6
        x += 3;// x=6+3→x=9
        return x;
    }

    public static void main(String[] args) {
        // subメソッドの処理ロジックを、変数funcに代入する
        // 代入されているのはsubメソッドへの参照
        IntBinaryOperator func = Test76::sub;

        // 変数funcに格納されている処理ロジックを引数5と3で実行する
        int a = func.applyAsInt(5, 3);
        System.out.println("5-3は" + a);

        IntBinaryOperator func2 = Test76::cal;
        int b = func2.applyAsInt(1, 0);
        System.out.println(b);
    }

}

▪️Test76.java 実行結果
5-3は2
5

▪️Test79.java 例2

import java.util.function.*;

public class Test79 {
    public static int submethod(int a, int b) {
        return a - b;
    }

    public static void main(String[] args) {
        // submethodの処理を変数rrrに代入する
        IntBinaryOperator rrr = Test79::submethod;
        // 変数rrrに格納されている処理ロジックを引数9と2で実行
        System.out.println(rrr.applyAsInt(9, 2));
    }
}

▪️Test79.java 実行結果
7

関数オブジェクトの代入

■変数に格納された関数の呼び出し
関数を格納した変数の名前 .SAM インタフェースのメソッド名(引数)

▪️Test78.java


public class Test78 {
    public static int sub(int a, int b) {
        return a - b;
    }

    public static void main(String[] args) {
        MyFunction aaa = Test78::sub;
    //変数に格納された関数の呼び出し
        int num = aaa.call(15, 5);
        System.out.println("15-5は" + num);
    }

}

▪️MyFunction.java

public interface MyFunction {
    public abstract int call(int x, int y);

}

▪️Test78.java 実行結果
15-5は10