こんにちは!侍エンジニア インストラクターの本多です。
Java8より「メソッド参照」が導入されました。
これを使うと、ラムダ式を書かずに直接メソッドを実行できる、などのメリットがあります。
この記事では、メソッド参照について
・メソッド参照とは何か
・メソッド参照の使い方
という基本的な内容から、
・コンストラクタ参照
といった応用的な内容に関しても解説していきます。
今回はメソッド参照について、使い方をわかりやすく解説します!
なお、ラムダ式そのものについて知りたい方は、以下のリンクをご覧ください。
なお、Javaの記事については、こちらにまとめています。
メソッド参照とは
すでに定義済みのメソッドを、引数なしで呼び出せるのがメソッド参照です。
ラムダ式と同じくJava8から導入された機能で、基本形は下記のとおりです。
クラス名::メソッド名
メソッド参照の使い方
メソッド参照の使い方について、要素の値を表示する基本的な例から、引数が複数ある場合や戻り値を返す場合など応用的な例についても確認していきましょう。
ラムダ式での呼び出しについて
ラムダ式でメソッドを呼び出す方法について、サンプルコードで確認してみましょう。
import java.util.ArrayList; public class Sample1 { public static void main(String args[]) { ArrayList<Integer> list = new ArrayList<>(); for(int i = 0 ; i < 10 ; i++) { list.add(i); } // ラムダ式 list.forEach(i -> System.out.print(i)); } }
実行結果:
0123456789
このサンプルコードでは、ラムダ式でメソッドを呼び出しています。
メソッド参照での呼び出しについて
先ほどのサンプルコードをメソッド参照で書き換えてみましょう。
import java.util.ArrayList; public class Sample2 { public static void main(String args[]) { ArrayList<Integer> list = new ArrayList<>(); for(int i = 0 ; i < 10 ; i++) { list.add(i); } // メソッド参照 list.forEach(System.out::print); } }
実行結果:
0123456789
ずいぶんすっきりした感じになります。
引数が複数の場合の扱い方について
引数が2つ以上の場合について、サンプルコードで確認していきましょう。
メソッド参照やラムダ式の記述を使う場合は、引数と戻り値の型が一致する関数型インターフェースのオブジェクトに代入します。
import java.util.Comparator; public class Sample3 { public static void main(String args[]) { Comparator<Integer> comp = Integer::compare; System.out.println(comp.compare(1, 2)); } }
実行結果:
-1
このサンプルコードでは、従来はInteger.compare()と記述しているコードをメソッド参照を使ってInteger::compareと記述しています。
戻り値の扱い方について
戻り値を持つメソッドのメソッド参照の呼び出しについて、サンプルコードで確認していきましょう。
import java.util.function.IntSupplier; public class Sample4 { public static void main(String args[]) { String str = "Hello"; IntSupplier is = str::length; // メソッド参照 System.out.println(is.getAsInt()); } }
実行結果:
5
このサンプルコードでは、従来はstr.length()と記述しているコードをメソッド参照を使ってstr::lengthと記述しています。
関数型インタフェースIntSupplierのオブジェクトisに戻り値を代入しています。
そしてgetAsIntメソッドを使って戻り値を取得しています。
なお、関数型インタフェースIntSupplierはパッケージjava.util.functionに含まれています。
パッケージjava.util.functionには、ラムダ式やメソッド参照のターゲットとなる型が含まれます。
str::lengthはint型を返すのでIntSupplierを使用しています。
他にもLongSupplierやDoubleSupplier、BooleanSupplierなどが用意されています。
コンストラクタ参照
メソッド参照と同じように、クラスのコンストラクタを参照することをコンストラクタ参照といい、戻り値としてオブジェクトを返します。
基本形は下記のとおりです。
クラス名::new
サンプルコードで確認していきましょう。
import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; class Sample4 { public static void main(String args[]) { // コンストラクタ参照 Supplier<ArrayList<Integer>> supplier = ArrayList::new; List<Integer> list = supplier.get(); for(int i = 0 ; i < 10 ; i++) { list.add(i); } list.forEach(System.out::print); } }
実行結果:
0123456789
このサンプルコードでは、ArrayList::newによってArrayList型のオブジェクトを生成し、supplier.get()でList型のオブジェクトを取得しています。
コンストラクタについて詳しく知りたい方へ
この記事で使用した、コンストラクタの基本的な使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
メソッドの使い方総まとめ(呼び出し、引数、戻り値)
この記事では紹介しきれなかったメソッドのいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!
まとめ
この記事ではメソッド参照について解説しました。
メソッド参照を使うと、Java8以前と比較してシンプルなコードが書けるようになります。
今はピンとこないかもしれませんが利用シーンが広がりつつあるので、今のうちに慣れておくことをおススメします。