Java, Java 8'de yöntem referansı adı verilen yeni bir özellik sağlar. Yöntem referansı, işlevsel arayüzün yöntemine atıfta bulunmak için kullanılır. Lambda ifadesinin kompakt ve kolay şeklidir. Sadece bir yönteme atıfta bulunmak için lambda ifadesini her kullandığınızda, lambda ifadenizi yöntem referansıyla değiştirebilirsiniz. Bu dersimizde metod referansı kavramını detaylı bir şekilde açıklıyoruz.
Yöntem Referans Türleri
Java'da aşağıdaki yöntem referansı türleri vardır:
- Statik bir yönteme referans.
- Bir örnek yöntemine referans.
- Bir yapıcıya referans.
1) Statik Bir Yönteme Referans
Sınıfta tanımlanan statik yönteme başvurabilirsiniz. Aşağıda Java'da statik yönteme başvurma sürecini açıklayan sözdizimi ve örnek verilmiştir.
Sözdizimi
ilkbaharda jpa
ContainingClass::staticMethodName
örnek 1
Aşağıdaki örnekte, işlevsel bir arayüz tanımladık ve statik bir yöntemi, onun işlevsel yöntemi say()'a atıfta bulunduk.
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(); } }Şimdi Test Edin
Çıktı:
Hello, this is static method.
Örnek 2
Aşağıdaki örnekte, statik yönteme başvurmak için önceden tanımlanmış Runnable fonksiyonel arayüzünü kullanıyoruz.
Java'yı karaktere dönüştürmek
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(); } }Şimdi Test Edin
Çıktı:
Thread is running...
Örnek 3
Yöntemlere başvurmak için önceden tanımlanmış işlevsel arayüzü de kullanabilirsiniz. Aşağıdaki örnekte BiFunction arayüzünü ve onun application() yöntemini kullanıyoruz.
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); } }Şimdi Test Edin
Çıktı:
30
Örnek 4
Ayrıca, yöntemlere başvurarak statik yöntemleri geçersiz kılabilirsiniz. Aşağıdaki örnekte üç add metodu tanımladık ve aşırı yükledik.
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); } }Şimdi Test Edin
Çıktı:
30 30.0 30.0
2) Örnek Yönteme Referans
Statik yöntemler gibi örnek yöntemlere de başvurabilirsiniz. Aşağıdaki örnekte, örnek yöntemine başvurma sürecini açıklıyoruz.
Sözdizimi
Java'da csv dosyası okuma
containingObject::instanceMethodName
örnek 1
Aşağıdaki örnekte statik olmayan yöntemlerden bahsediyoruz. Yöntemlere sınıf nesnesine ve anonim nesneye göre başvurabilirsiniz.
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(); } }Şimdi Test Edin
Çıktı:
if else if else java
Hello, this is non-static method. Hello, this is non-static method.
Örnek 2
Aşağıdaki örnekte örnek (statik olmayan) yöntemden bahsediyoruz. Çalıştırılabilir arayüz yalnızca bir soyut yöntem içerir. Yani onu fonksiyonel arayüz olarak kullanabiliriz.
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(); } }Şimdi Test Edin
Çıktı:
Hello, this is instance method
Örnek 3
Aşağıdaki örnekte BiFunction arayüzünü kullanıyoruz. Önceden tanımlanmış bir arayüzdür ve application() işlevsel yöntemini içerir. Burada add metodundan, application metoduna bahsediyoruz.
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); } }Şimdi Test Edin
Çıktı:
30
3) Bir Oluşturucuya Referans
New anahtar sözcüğünü kullanarak bir kurucuya başvurabilirsiniz. Burada fonksiyonel arayüz yardımıyla yapıcıdan bahsediyoruz.
Sözdizimi
ClassName::new
Örnek
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'); } }Şimdi Test Edin
Çıktı:
Hello