Java
java8

Java8のお勉強(メソッド参照)

今回はメソッド参照のお勉強です。
関数型IFの変数にメソッドを代入することが出来るらしいです。
関数型IFの(唯一の)抽象メソッド呼ばれたらこの代入(指定した)メソッド実行してね言ってるイメージだと思います。
関数型IF忘れた人は前回の記事参照

とりあえず以下のように関数型IFを2つ用意します。

@FunctionalInterface
public interface SampleFunctionalIF {

    String methodA();

}
@FunctionalInterface
public interface SampleFunctionalIF2 {

    String methodA(String A, String B);

}

で、これらを呼び出すクラスを用意したのがこちら

/**
 * メソッド参照のお勉強。
 * 関数型IFの変数にメソッドを代入することが出来る。
 * 関数型IFの(唯一の)抽象メソッド呼ばれたらこの代入(指定した)メソッド実行してね言ってるイメージだと思います。
 * @author komikcomik
 *
 */
public class MethodRef {

    public static void main(String[] args) {
        /* 引数なしの場合 */
        // SampleFunctionalIFの抽象IFであるmethodAが呼ばれたら代わりにこのクラスのメソッドhelloを実行してねといっているイメージ
        System.out.println("-----例1-----");
        SampleFunctionalIF if1 = MethodRef::hello;
        System.out.println(if1.methodA());

        /* 引数1個の場合 */
        // この辺はリストに適当に値詰めてるだけ
        System.out.println("-----例2-----");
        List<String> l = new ArrayList<>();
        l.add("hoge");
        l.add("hogehoge");
        l.forEach(System.out::println); // 関数型IFであるListの抽象メソッドの実装をSystem.out.println(s)と指定しているイメージ
        l.forEach(MethodRef::echo); // 1つ上と似たような感じだけど自作メソッドも当然代入できる


        /* 引数2個の場合 */
        System.out.println("-----例3-----");
        SampleFunctionalIF2 if2 = MethodRef::join;
        System.out.println(if2.methodA("Hello", "World"));

    }

    public static String hello() {
        System.out.println("helloメソッド呼ばれたよ");
        return "hello";

    }

    public static String join(String A, String B) {
        return A + B;

    }

    public static void echo(String s) {
        System.out.println(s);
    }
}

実行結果は以下のようになります。

-----例1-----
helloメソッド呼ばれたよ
hello
-----例2-----
hoge
hogehoge
hoge
hogehoge
-----例3-----
HelloWorld

まあ想定通りですね。ただやっぱりラムダ式の書き方とか今回の::みたいな書き方に慣れていないのでなんとなく身構えてしまう・・・。
ラムダ式は引数 -> 処理 って書いていて今回の例2相当をラムダ式で書いたら

        l.forEach(s -> {
            System.out.println(s);
        });

となるので、似たような効果が得られるみたいですね。バリバリ使っている人はどうやって使い分けているのだろうか。