logo

Java-menetelmäviitteet

Java tarjoaa Java 8:ssa uuden ominaisuuden nimeltä metodiviittaus. Method-viittausta käytetään viittaamaan toiminnallisen käyttöliittymän menetelmään. Se on kompakti ja helppo muotoinen lambda-ilmaisu. Aina kun käytät lambda-lauseketta viittaamaan vain menetelmään, voit korvata lambda-lausekkeen menetelmäviittauksella. Tässä opetusohjelmassa selitämme menetelmäviittauksen käsitteen yksityiskohtaisesti.


Menetelmäviittausten tyypit

Javassa on seuraavan tyyppisiä menetelmäviittauksia:

  1. Viittaus staattiseen menetelmään.
  2. Viittaus instanssimenetelmään.
  3. Viittaus rakentajaan.
Java-menetelmäviitteiden tyypit

1) Viittaus staattiseen menetelmään

Voit viitata luokassa määriteltyyn staattiseen metodiin. Seuraavassa on syntaksi ja esimerkki, jotka kuvaavat staattiseen menetelmään viittaamista Javassa.

Syntaksi

 ContainingClass::staticMethodName 

Esimerkki 1

Seuraavassa esimerkissä olemme määritelleet toiminnallisen rajapinnan ja viittaamme staattiseen metodiin sen toiminnalliseen menetelmään say().

nat vs sänky
 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(); } } 
Testaa nyt

Lähtö:

 Hello, this is static method. 

Esimerkki 2

Seuraavassa esimerkissä käytämme ennalta määritettyä toiminnallista käyttöliittymää Runnable viittaamaan staattiseen menetelmään.

 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(); } } 
Testaa nyt

Lähtö:

 Thread is running... 

Esimerkki 3

Voit myös käyttää ennalta määritettyä toiminnallista käyttöliittymää menetelmiin viittaamiseen. Seuraavassa esimerkissä käytämme BiFunction-käyttöliittymää ja sen apply()-metodia.

 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); } } 
Testaa nyt

Lähtö:

 30 

Esimerkki 4

Voit myös ohittaa staattiset menetelmät viittaamalla menetelmiin. Seuraavassa esimerkissä olemme määrittäneet ja ylikuormittaneet kolme lisäysmenetelmää.

 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); } } 
Testaa nyt

Lähtö:

 30 30.0 30.0 

2) Viittaus instanssimenetelmään

kuten staattiset menetelmät, voit viitata myös ilmentymämenetelmiin. Seuraavassa esimerkissä kuvataan prosessi, jossa viitataan ilmentymämenetelmään.

Syntaksi

 containingObject::instanceMethodName 

Esimerkki 1

Seuraavassa esimerkissä viittaamme ei-staattisiin menetelmiin. Voit viitata menetelmiin luokkaobjektin ja anonyymin objektin mukaan.

 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(); } } 
Testaa nyt

Lähtö:

pelastaa
 Hello, this is non-static method. Hello, this is non-static method. 

Esimerkki 2

Seuraavassa esimerkissä viittaamme esiintymän (ei-staattiseen) menetelmään. Suoritettava käyttöliittymä sisältää vain yhden abstraktin menetelmän. Joten voimme käyttää sitä toiminnallisena käyttöliittymänä.

 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(); } } 
Testaa nyt

Lähtö:

 Hello, this is instance method 

Esimerkki 3

Seuraavassa esimerkissä käytämme BiFunction-käyttöliittymää. Se on ennalta määritetty käyttöliittymä ja sisältää toiminnallisen menetelmän apply(). Tässä viittaamme menetelmän lisäämiseen menetelmän soveltamiseen.

 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); } } 
Testaa nyt

Lähtö:

 30 

3) Viittaus rakentajaan

Voit viitata rakentajaan käyttämällä uutta avainsanaa. Tässä viitataan rakentajaan toiminnallisen käyttöliittymän avulla.

Syntaksi

 ClassName::new 

Esimerkki

 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'); } } 
Testaa nyt

Lähtö:

 Hello