logo

Java módszer hivatkozások

A Java a Java 8-ban metódushivatkozásnak nevezett új szolgáltatást biztosít. A metódushivatkozás a funkcionális interfész metódusára hivatkozik. A lambda kifejezés kompakt és egyszerű formája. Minden alkalommal, amikor lambda-kifejezést csak egy metódusra hivatkozik, lecserélheti a lambda-kifejezést metódushivatkozásra. Ebben az oktatóanyagban részletesen elmagyarázzuk a módszerreferencia fogalmát.


A módszerreferenciák típusai

A következő típusú metódushivatkozások léteznek a Java-ban:

  1. Hivatkozás statikus módszerre.
  2. Hivatkozás egy példánymódszerre.
  3. Konstruktorra való hivatkozás.
Java-módszer-hivatkozások típusai

1) Hivatkozás egy statikus módszerre

Hivatkozhat az osztályban meghatározott statikus metódusra. A következő a szintaxis és a példa, amely leírja a statikus metódusra hivatkozás folyamatát Java-ban.

Szintaxis

 ContainingClass::staticMethodName 

1. példa

A következő példában definiáltunk egy funkcionális interfészt, és hivatkozunk egy statikus metódusra a say() funkcionális metódusára.

 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(); } } 
Tesztelje most

Kimenet:

 Hello, this is static method. 

2. példa

A következő példában előre definiált funkcionális interfészt használunk, amely futtatható a statikus metódus hivatkozására.

 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(); } } 
Tesztelje most

Kimenet:

 Thread is running... 

3. példa

Előre meghatározott funkcionális interfészt is használhat a metódusok hivatkozására. A következő példában a BiFunction felületet használjuk, és annak apply() metódusát használjuk.

 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); } } 
Tesztelje most

Kimenet:

 30 

4. példa

A statikus módszereket a metódusok hivatkozásával is felülírhatja. A következő példában három hozzáadási módszert definiáltunk és túlterheltünk.

 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); } } 
Tesztelje most

Kimenet:

 30 30.0 30.0 

2) Példánymódszerre való hivatkozás

a statikus metódusokhoz hasonlóan a példánymetódusokra is hivatkozhat. A következő példában a példánymódszer hivatkozási folyamatát írjuk le.

Szintaxis

 containingObject::instanceMethodName 

1. példa

A következő példában nem statikus módszerekre hivatkozunk. A metódusokra hivatkozhat osztályobjektum és névtelen objektum szerint.

 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(); } } 
Tesztelje most

Kimenet:

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

2. példa

A következő példában a példány (nem statikus) módszerre hivatkozunk. A futtatható felület csak egy absztrakt metódust tartalmaz. Tehát funkcionális interfészként használhatjuk.

 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(); } } 
Tesztelje most

Kimenet:

 Hello, this is instance method 

3. példa

A következő példában a BiFunction felületet használjuk. Ez egy előre definiált interfész, és tartalmaz egy funkcionális apply() metódust. Itt a módszer hozzáadásának módszerére hivatkozunk.

 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); } } 
Tesztelje most

Kimenet:

 30 

3) Hivatkozás egy konstruktorra

Az új kulcsszó használatával hivatkozhat egy konstruktorra. Itt funkcionális interfész segítségével hivatkozunk a konstruktorra.

Szintaxis

 ClassName::new 

Példa

 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'); } } 
Tesztelje most

Kimenet:

 Hello