Java poskytuje novou funkci nazvanou odkaz na metodu v jazyce Java 8. Odkaz na metodu se používá k odkazování na metodu funkčního rozhraní. Jedná se o kompaktní a snadnou formu lambda výrazu. Pokaždé, když používáte výraz lambda pouze k odkazování na metodu, můžete svůj výraz lambda nahradit odkazem na metodu. V tomto tutoriálu podrobně vysvětlujeme koncept referenční metody.
Typy referencí metod
V jazyce Java existují následující typy odkazů na metody:
- Odkaz na statickou metodu.
- Odkaz na metodu instance.
- Odkaz na konstruktéra.
1) Odkaz na statickou metodu
Můžete odkazovat na statickou metodu definovanou ve třídě. Následuje syntaxe a příklad, které popisují proces odkazování statické metody v Javě.
převést řetězec na char
Syntax
ContainingClass::staticMethodName
Příklad 1
V následujícím příkladu jsme definovali funkční rozhraní a odkázali statickou metodu na její funkční metodu 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(); } }Otestujte to hned
Výstup:
Hello, this is static method.
Příklad 2
V následujícím příkladu používáme k odkazování statické metody předdefinované funkční rozhraní 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(); } }Otestujte to hned
Výstup:
Thread is running...
Příklad 3
K odkazování metod můžete také použít předdefinované funkční rozhraní. V následujícím příkladu používáme rozhraní BiFunction a jeho metodu 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); } }Otestujte to hned
Výstup:
30
Příklad 4
Můžete také přepsat statické metody odkazováním na metody. V následujícím příkladu jsme definovali a přetížili tři metody přidání.
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); } }Otestujte to hned
Výstup:
30 30.0 30.0
2) Odkaz na metodu instance
jako statické metody můžete také odkazovat na metody instance. V následujícím příkladu popisujeme proces odkazování na metodu instance.
Syntax
containingObject::instanceMethodName
Příklad 1
V následujícím příkladu odkazujeme na nestatické metody. Metody můžete odkazovat podle objektu třídy a anonymního 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(); } }Otestujte to hned
Výstup:
Hello, this is non-static method. Hello, this is non-static method.
Příklad 2
V následujícím příkladu odkazujeme na instanční (nestatickou) metodu. Spustitelné rozhraní obsahuje pouze jednu abstraktní metodu. Můžeme jej tedy použít jako funkční rozhraní.
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(); } }Otestujte to hned
Výstup:
Hello, this is instance method
Příklad 3
V následujícím příkladu používáme rozhraní BiFunction. Je to předdefinované rozhraní a obsahuje funkční metodu apply(). Zde odkazujeme na metodu přidání k aplikaci metody.
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); } }Otestujte to hned
Výstup:
30
3) Odkaz na konstruktéra
Konstruktor můžete odkázat pomocí klíčového slova new. Zde odkazujeme konstruktor pomocí funkčního rozhraní.
Syntax
ClassName::new
Příklad
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'); } }Otestujte to hned
Výstup:
Hello