Java 8 では、Java 8 でメソッド参照と呼ばれる新機能が提供されています。メソッド参照は、関数インターフェースのメソッドを参照するために使用されます。コンパクトで簡単なラムダ式です。メソッドを参照するためにラムダ式を使用するたびに、ラムダ式をメソッド参照に置き換えることができます。このチュートリアルでは、メソッド参照の概念について詳しく説明します。
メソッド参照の種類
Java には次の種類のメソッド参照があります。
- 静的メソッドへの参照。
- インスタンスメソッドへの参照。
- コンストラクターへの参照。
1) 静的メソッドへの参照
クラス内に定義された静的メソッドを参照できます。以下は、Java で静的メソッドを参照するプロセスを説明する構文と例です。
構文
Java仮想マシン
ContainingClass::staticMethodName
例1
次の例では、関数型インターフェイスを定義し、静的メソッドをその関数型メソッド Say() に参照しています。
interface Sayable{ void say(); } public class MethodReference { public static void saySomething(){ System.out.println('Hello, this is static method.'); } public static void main(String[] args) { // Referring static method Sayable sayable = MethodReference::saySomething; // Calling interface method sayable.say(); } }今すぐテストしてください
出力:
Hello, this is static method.
例 2
次の例では、事前定義された関数インターフェイス Runnable を使用して静的メソッドを参照しています。
グリッドレイアウト
public class MethodReference2 { public static void ThreadStatus(){ System.out.println('Thread is running...'); } public static void main(String[] args) { Thread t2=new Thread(MethodReference2::ThreadStatus); t2.start(); } }今すぐテストしてください
出力:
Thread is running...
例 3
事前定義された関数インターフェイスを使用してメソッドを参照することもできます。次の例では、BiFunction インターフェイスとその apply() メソッドを使用しています。
import java.util.function.BiFunction; class Arithmetic{ public static int add(int a, int b){ return a+b; } } public class MethodReference3 { public static void main(String[] args) { BiFunctionadder = Arithmetic::add; int result = adder.apply(10, 20); System.out.println(result); } }今すぐテストしてください
出力:
30
例 4
メソッドを参照することで静的メソッドをオーバーライドすることもできます。次の例では、3 つの add メソッドを定義してオーバーロードしました。
import java.util.function.BiFunction; class Arithmetic{ public static int add(int a, int b){ return a+b; } public static float add(int a, float b){ return a+b; } public static float add(float a, float b){ return a+b; } } public class MethodReference4 { public static void main(String[] args) { BiFunctionadder1 = Arithmetic::add; BiFunctionadder2 = Arithmetic::add; BiFunctionadder3 = Arithmetic::add; int result1 = adder1.apply(10, 20); float result2 = adder2.apply(10, 20.0f); float result3 = adder3.apply(10.0f, 20.0f); System.out.println(result1); System.out.println(result2); System.out.println(result3); } }今すぐテストしてください
出力:
30 30.0 30.0
2) インスタンスメソッドの参照
静的メソッドと同様に、インスタンス メソッドも参照できます。次の例では、インスタンス メソッドを参照するプロセスを説明します。
構文
私のライブクリクレット
containingObject::instanceMethodName
例1
次の例では、非静的メソッドを参照しています。メソッドはクラスオブジェクトと匿名オブジェクトで参照できます。
interface Sayable{ void say(); } public class InstanceMethodReference { public void saySomething(){ System.out.println('Hello, this is non-static method.'); } public static void main(String[] args) { InstanceMethodReference methodReference = new InstanceMethodReference(); // Creating object // Referring non-static method using reference Sayable sayable = methodReference::saySomething; // Calling interface method sayable.say(); // Referring non-static method using anonymous object Sayable sayable2 = new InstanceMethodReference()::saySomething; // You can use anonymous object also // Calling interface method sayable2.say(); } }今すぐテストしてください
出力:
int を string に変換する
Hello, this is non-static method. Hello, this is non-static method.
例 2
次の例では、インスタンス (非静的) メソッドを参照しています。実行可能なインターフェイスには、抽象メソッドが 1 つだけ含まれています。したがって、関数インターフェイスとして使用できます。
public class InstanceMethodReference2 { public void printnMsg(){ System.out.println('Hello, this is instance method'); } public static void main(String[] args) { Thread t2=new Thread(new InstanceMethodReference2()::printnMsg); t2.start(); } }今すぐテストしてください
出力:
Hello, this is instance method
例 3
次の例では、BiFunction インターフェイスを使用しています。これは事前定義されたインターフェイスであり、関数メソッド apply() が含まれています。ここでは、add メソッドを apply メソッドと呼んでいます。
import java.util.function.BiFunction; class Arithmetic{ public int add(int a, int b){ return a+b; } } public class InstanceMethodReference3 { public static void main(String[] args) { BiFunctionadder = new Arithmetic()::add; int result = adder.apply(10, 20); System.out.println(result); } }今すぐテストしてください
出力:
30
3) コンストラクターへの参照
new キーワードを使用してコンストラクターを参照できます。ここでは、関数型インターフェイスの助けを借りてコンストラクターを参照しています。
構文
ClassName::new
例
interface Messageable{ Message getMessage(String msg); } class Message{ Message(String msg){ System.out.print(msg); } } public class ConstructorReference { public static void main(String[] args) { Messageable hello = Message::new; hello.getMessage('Hello'); } }今すぐテストしてください
出力:
Hello