LoginSignup
4
7

More than 5 years have passed since last update.

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

Posted at

今回はメソッド参照のお勉強です。
関数型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);
        });

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

4
7
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
4
7