今回はメソッド参照のお勉強です。
関数型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);
});
となるので、似たような効果が得られるみたいですね。バリバリ使っている人はどうやって使い分けているのだろうか。