Java предоставя нова функция, наречена препратка към метод в Java 8. Препратката към метод се използва за препращане към метод на функционален интерфейс. Това е компактна и лесна форма на ламбда израз. Всеки път, когато използвате ламбда израз просто за препращане към метод, можете да замените своя ламбда израз с препратка към метод. В този урок ние обясняваме подробно концепцията за референтен метод.
Видове препратки към методите
В Java има следните типове препратки към методи:
- Препратка към статичен метод.
- Препратка към метод на екземпляр.
- Препратка към конструктор.
1) Препратка към статичен метод
Можете да се обърнете към статичен метод, дефиниран в класа. Следва синтаксисът и примерът, които описват процеса на рефериране на статичен метод в Java.
Синтаксис
как да отворите скрити приложения на android
ContainingClass::staticMethodName
Пример 1
В следващия пример сме дефинирали функционален интерфейс и сме препратили статичен метод към неговия функционален метод 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(); } }Тествайте сега
Изход:
Hello, this is static method.
Пример 2
В следващия пример използваме предварително дефиниран функционален интерфейс 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(); } }Тествайте сега
Изход:
Thread is running...
Пример 3
Можете също да използвате предварително дефиниран функционален интерфейс за препращане към методи. В следващия пример използваме интерфейс BiFunction и използваме неговия метод 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); } }Тествайте сега
Изход:
30
Пример 4
Можете също така да замените статичните методи чрез препращащи методи. В следващия пример сме дефинирали и претоварили три метода за добавяне.
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); } }Тествайте сега
Изход:
30 30.0 30.0
2) Препратка към метод на екземпляр
като статичните методи, можете също да препращате методи на екземпляри. В следващия пример ние описваме процеса на препращане на метода на екземпляра.
Синтаксис
низ за чат
containingObject::instanceMethodName
Пример 1
В следващия пример имаме предвид нестатични методи. Можете да препращате към методи по клас обект и анонимен обект.
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(); } }Тествайте сега
Изход:
java replaceall
Hello, this is non-static method. Hello, this is non-static method.
Пример 2
В следващия пример имаме препратка към метод на екземпляр (нестатичен). Изпълняемият интерфейс съдържа само един абстрактен метод. Така че можем да го използваме като функционален интерфейс.
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(); } }Тествайте сега
Изход:
Hello, this is instance method
Пример 3
В следващия пример използваме интерфейс BiFunction. Това е предварително дефиниран интерфейс и съдържа функционален метод apply(). Тук имаме предвид добавяне на метод за прилагане на метод.
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); } }Тествайте сега
Изход:
30
3) Препратка към конструктор
Можете да посочите конструктор, като използвате ключовата дума new. Тук имаме предвид конструктор с помощта на функционален интерфейс.
Синтаксис
ClassName::new
Пример
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'); } }Тествайте сега
Изход:
Hello