Der folgende Artikel enthält eine Übersicht über Java-Methodenreferenzen. In JDK 8 werden Lambda-Ausdrücke eingeführt, um anonyme Methoden in einer Zeile zu erstellen und eine Operation auszuführen. Beim Schreiben eines Lambda-Ausdrucks beim Aufruf einer vorhandenen Methode wird ein solcher Vorgang jedoch mithilfe von Methodenreferenzen ermöglicht. Dadurch werden die Ausdrücke kompakter und lesbarer, wenn ein Aufruf einer vorhandenen Methode vorhanden ist. Darüber hinaus wird im Methodenreferenzbereich der Auflösungsoperator (::) verwendet, um den Methodennamen vom Klassennamen zu trennen.
Starten Sie Ihren kostenlosen Softwareentwicklungskurs
Webentwicklung, Programmiersprachen, Softwaretests und andere
Lassen Sie uns die Notwendigkeit von Methodenreferenzen anhand eines Beispiels erkennen:
Code:
public class Employee { public enum Sex { MALE, FEMALE } String name; LocalDatejoiningDate; Sex gender; String emailAddress; public int getNumberOfYears() { } public Calendar getJoiningDate() { return joiningDate; } public static int compareByJoiningDate(Employeea, Employeeb) { return a.joiningDate.compareTo(b.joiningDate); }}
Und wenn wir die Mitarbeiterliste nach dem Beitrittsdatum sortieren möchten, also wer zuerst beitritt, können wir die unten angegebene Methode in einer der Unterklassen aufrufen.
Code:
Person[] rosterAsArray = roster.toArray(new Employee[roster.size()]); class JoiningDateComparator implements Comparator<Employee> { public int compare(Employeea, Employeeb) { return a.getJoiningDate().compareTo(b.getJoiningDate()); } }
Wir können also einen Lambda-Ausdruck schreiben, um die obige Methode aufzurufen und gleichzeitig die Liste zu sortieren, um die Beitrittsdaten von zwei Mitarbeitern zu vergleichen.
Code:
Arrays.sort(rosterAsArray, (a, b) ->Person.compareByAge(a, b) );
Oder wir können die Methode wie folgt aufrufen; Beide haben die gleiche Bedeutung, die Methode für jedes Objektpaar im Array aufzurufen.
Code:
Arrays.sort(rosterAsArray, Person::compareByAge)
Die folgenden vier Arten von Methodenreferenzen gibt es in JDk 8:
Der Verweis auf eine statische Methode mit dem Operator :: wird als Verweis auf eine statische Methode bezeichnet.
Syntax:
ClassName::MethodName()
Arbeitstätig:
Beispiel:
Im folgenden Beispiel wird die statische Methode add der Klasse Addition mithilfe der Funktionalität der Klasse bifunction im Paket java.util aufgerufen, wobei die Referenz dieser Methode im myObj-Objekt gespeichert und mit den erforderlichen Werten übergeben wird als Argumente übergeben werden.
Code:
import java.util.function.BiFunction; class Addition{ public static int add(int a, int b){ return a+b; } } public class HelloWorld { public static void main(String[] args) { BiFunction<Integer, Integer, Integer>myObj = Addition::add; int res = myObj.apply(30, 5); System.out.println("Sum of given number is: "+res); } }
Ausgabe:
Syntax:
object::methodName()
Arbeitstätig:
Beispiel:
Im folgenden Beispiel wird die showName-Methode der Klasse HelloWorld unter Verwendung einer Methodenreferenz auf Instanzmethoden aufgerufen.
Code:
interface MyInterface{ void display(); } public class HelloWorld { public void showName(){ System.out.println("Call to method ShowName"); } public static void main(String[] args) { HelloWorld obj = new HelloWorld(); MyInterface ref = obj::showName; ref.display(); } }
Ausgabe:
Syntax:
ClassName :: instanceMethodName()
Arbeitstätig:
Beispiel: Im folgenden Beispiel rufen wir die Methode „compareToIgnoreCase“ für alle im Array gespeicherten Zeichenfolgen auf. Anstatt also verschiedene Objekte einzeln zu übergeben, geschieht dies in einer einzigen Anweisung mithilfe einer Liste.
Code:
import java.util.Arrays; public class HelloWorld { public static void main(String[] args) { String[] empArray = { "John", "Jack", "Aditya", "Vishal", "Saurabh", "Amanda", "Daniel"}; Arrays.sort(empArray, String::compareToIgnoreCase); System.out.println("Sorted list of names of Employees \n"); for(String str: empArray){ System.out.println(str); } } }
Ausgabe:
Syntax:
myFunc(roster, HashSet<MyClass>::new);
Arbeitstätig:
Nehmen wir ein Beispiel eines Lambda-Ausdrucks, der einen Aufruf der folgenden Methode enthält und die Übergabe eines neuen Konstruktors von HashSet erfordert.
Code:
publicstatic<T, MYSRCextends Collection<T>, MYDESTextends Collection<T>> MYDEST MyMethod( MYSRC src, Supplier< MYDEST>dest) { MYDEST res = collectionFactory.get(); for (T t : src) {res.add(t); } returnres; }
Dann wäre der Lambda-Ausdruck wie folgt:
Code:
Set<myClass>rosterSet = MyMethod(roster, HashSet::new);
Hier schließt JRE automatisch, dass die übergebenen Argumente Objekte vom Typ „myClass“ enthalten, oder wir können entweder den folgenden Lambda-Ausdruck verwenden, um
Set<myClass>rosterSet = transferElements(roster, HashSet<myClass>::new);
Example: In the below example, a constructor of a firstReference class is being called using ‘new’ operator and stored in a reference variable ‘inObj’. This reference variable is then used to refer to the instance methods of this class.
Code:
@FunctionalInterface interface firstInterface{ firstReference show(String say); } class firstReference{ public firstReference(String say){ System.out.print(say); } } public class HelloWorld { public static void main(String[] args) { //Method reference to a constructor firstInterface inObj = firstReference::new; inObj.show("Let’s begin learning Contructor type method reference"); } }
Output:
Method Reference is a way to make a call to an existing method in lambda expressions being used in the application. This feature has been introduced with JDK 1.8 to make lambda expressions more compact and reuse the existing code. There are four ways to make calls to the methods of the class names as shown above.
Das obige ist der detaillierte Inhalt vonJava-Methodenreferenzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!