Heim  >  Artikel  >  Java  >  Java-Methodenreferenzen

Java-Methodenreferenzen

王林
王林Original
2024-08-30 15:09:10430Durchsuche

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

Arten von Java-Methodenreferenzen

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:

1. Verweis auf statische Methode

Der Verweis auf eine statische Methode mit dem Operator :: wird als Verweis auf eine statische Methode bezeichnet.

Syntax:

ClassName::MethodName()

Arbeitstätig:

  • Hier ist die Methode, auf die verwiesen wird, von einem statischen Typ, was bedeutet, dass keine Instanz der Klasse erforderlich ist, um diese Methode aufzurufen; stattdessen wäre nur Klassenname ausreichend.
  • Wenn also ClassName::MethodName in seinem Lambda-Ausdruck angegeben wird, geht JRE zu dieser Klasse, um eine statische Methode in der genannten Klasse zu finden. Da es sich um einen Aufruf einer statischen Methode handelt, kann er nicht unter einem nicht statischen Block erwähnt werden.

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:

Java-Methodenreferenzen

2. Verweis auf eine Instanzmethode eines bestimmten Objekts

Syntax:

object::methodName()

Arbeitstätig:

  • Bei dieser Art von Referenz verwendet man ein Objekt der Klasse, um auf eine ihrer Instanzmethoden zu verweisen. Hier prüft JRE, ob die übergebenen Argumente vom gleichen Typ sind wie in der Methodendeklaration erwähnt.
  • Dies hilft beim Schreiben eines Lambda-Ausdrucks mithilfe der Instanzmethoden der Klasse.

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:

Java-Methodenreferenzen

3. Verweis auf eine Instanzmethode eines beliebigen Objekts eines bestimmten Typs

Syntax:

ClassName :: instanceMethodName()

Arbeitstätig:

  • Dies ist die gleiche Art von Referenz wie oben angegeben. Der Unterschied besteht darin, dass sich die Objekte, auf die hier verwiesen wird, ständig ändern, was bedeutet, dass viele Objekte dieselbe Methode aufrufen, aber vom gleichen Typ, indem sie Methodenreferenzen verwenden.

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:

Java-Methodenreferenzen

4. Verweis auf einen Konstruktor

Syntax:

myFunc(roster, HashSet<MyClass>::new);

Arbeitstätig:

  • Dieser Referenzaufruf wird auch durchgeführt, um einen Konstruktor einer Klasse aufzurufen.
  • Hierfür wird das Schlüsselwort „new“ in einem Lambda-Ausdruck verwendet, und zwar so, dass JRE daraus schließt, den Konstruktor dieser bestimmten Klasse aufzurufen.

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:

Java-Methodenreferenzen

Conclusion

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Auspacken in JavaNächster Artikel:Auspacken in Java