Java ponuja novo funkcijo, imenovano referenca metode v Javi 8. Referenca metode se uporablja za sklicevanje na metodo funkcionalnega vmesnika. Je kompaktna in enostavna oblika lambda izraza. Vsakič, ko uporabljate lambda izraz samo za sklicevanje na metodo, lahko svoj lambda izraz zamenjate s sklicem na metodo. V tej vadnici podrobno razlagamo koncept referenčne metode.
Vrste referenc metod
V Javi obstajajo naslednje vrste referenc metod:
Kat timpf
- Sklicevanje na statično metodo.
- Sklicevanje na metodo primerka.
- Sklicevanje na konstruktorja.
1) Sklicevanje na statično metodo
Lahko se sklicujete na statično metodo, definirano v razredu. Sledi sintaksa in primer, ki opisujeta postopek napotitve statične metode v Javi.
Sintaksa
ContainingClass::staticMethodName
Primer 1
V naslednjem primeru smo definirali funkcionalni vmesnik in napotili statično metodo na njeno funkcionalno metodo 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(); } }Preizkusite zdaj
Izhod:
Hello, this is static method.
Primer 2
V naslednjem primeru uporabljamo vnaprej določen funkcijski vmesnik Runnable za sklicevanje na statično metodo.
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(); } }Preizkusite zdaj
Izhod:
Thread is running...
Primer 3
Za referenčne metode lahko uporabite tudi vnaprej določen funkcionalni vmesnik. V naslednjem primeru uporabljamo vmesnik BiFunction in njegovo metodo 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); } }Preizkusite zdaj
Izhod:
30
Primer 4
Statične metode lahko preglasite tudi z referenčnimi metodami. V naslednjem primeru smo definirali in preobremenili tri metode dodajanja.
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); } }Preizkusite zdaj
Izhod:
30 30.0 30.0
2) Sklicevanje na metodo primerka
tako kot statične metode, se lahko sklicujete tudi na instančne metode. V naslednjem primeru opisujemo postopek sklicevanja na metodo primerka.
Sintaksa
containingObject::instanceMethodName
Primer 1
V naslednjem primeru mislimo na nestatične metode. Metode lahko navajate po objektu razreda in anonimnem objektu.
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(); } }Preizkusite zdaj
Izhod:
Hello, this is non-static method. Hello, this is non-static method.
Primer 2
V naslednjem primeru se sklicujemo na (nestatično) metodo primerka. Runnable vmesnik vsebuje samo eno abstraktno metodo. Torej ga lahko uporabimo kot funkcionalni vmesnik.
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(); } }Preizkusite zdaj
Izhod:
vrsta kopice
Hello, this is instance method
Primer 3
V naslednjem primeru uporabljamo vmesnik BiFunction. Je vnaprej določen vmesnik in vsebuje funkcionalno metodo apply(). Tu imamo v mislih dodajanje metode za uporabo metode.
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); } }Preizkusite zdaj
Izhod:
30
3) Sklicevanje na konstruktorja
Konstruktorja lahko napotite z uporabo nove ključne besede. Tukaj imamo v mislih konstruktorja s pomočjo funkcijskega vmesnika.
Sintaksa
ClassName::new
Primer
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'); } }Preizkusite zdaj
Izhod:
Hello