LoginSignup
14
20

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-05

■変数へのメソッド参照の格納
メソッドが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

14
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
20