今日のjavaおっかけ(20150513):メソッド参照

目次とぶっつぶつテーマ

http://snoopopo.hatenablog.com/entry/2015/04/14/102732

今日のテーマ:メソッド参照

こちらもjava8から登場。

        //メソッド参照
        Consumer<String> s = System.out::println;
        s.accept("aa");

いつもの System.out.println("aa") をConsumerの関数型インタフェースに入れれる。

Consumerは関数型インタフェースなので、唯一のメソッドであるacceptメソッドで sysout が使えるようになったかんじ。

構文

関数型インタフェースクラス 変数名 = 代入したいメソッドのオブジェクト::代入したいメソッド

渡したいメソッドの直前に::をつける。

オーバーロードされたメソッドの場合は?

メソッド名のあとの引数の指定をしていないから、オーバーロードメソッドがある場合どれなのかと思った結果

・適当に作ったTestクラス

   public void run(String str) {
        System.out.println("test(Strign str)");
    }

    public void run(String str, String str2) {
        System.out.println("test(Strign str,String str2)");
    }

    public void run(Integer i) {
        System.out.println("Integer i");
    }

・使う側

       //ジェネリクスでString指定してるから、run(String)がよばれる
        Test test = new Test();
        Consumer<String> poyo = test::run;
        poyo.accept("");

        //run(String,String)メソッドは出来ない??

        //ジェネリクスでInteger指定しているから、run(Integer)がよばれる
        Test test = new Test();
        Consumer<String> poyo = test::run;
        poyo.accept("");

となった。