Apropos Java 8: Das erste, was mir in den Sinn kommt, ist Lambda (Abschluss) und die virtuelle Erweiterungsmethode (Standardmethode). Diese Funktion wird seit langem von großen Technologie-Websites gehypt und ist auch die erste Funktion, über die wir hier sprechen werden Zu Beginn unserer Java 8-Reihe (JEP126 http://openjdk.java.net/jeps/126) wurden einige Bibliotheken von jdk8 mithilfe von Lambda-Ausdrücken neu gestaltet. Das Verständnis ist für das Erlernen der neuen Funktionen von Java 8 von großer Bedeutung.
1. Funktionsschnittstelle
Funktionsschnittstelle (Funktionsschnittstelle wird auch Funktionsschnittstelle genannt, ist aber eigentlich dasselbe). Einfach ausgedrückt ist eine funktionale Schnittstelle eine Schnittstelle, die nur eine Methode enthält. Beispielsweise sind java.lang.Runnable und java.util.Comparator in der Java-Standardbibliothek typische Funktionsschnittstellen. Java 8 stellt @FunctionalInterface als Annotation bereit. Solange die Schnittstelle den Standards funktionaler Schnittstellen entspricht (d. h. eine Schnittstelle, die nur eine Methode enthält), wird sie von der virtuellen Maschine automatisch ermittelt Verwenden Sie am besten die Annotation @FunctionalInterface für die Schnittstelle. Dadurch wird verhindert, dass andere Personen im Team versehentlich neue Methoden zur Schnittstelle hinzufügen.
Lambda kann in Java nicht alleine angezeigt werden. Der Körper der Lambda-Ausdrucksmethode ist tatsächlich die Implementierung der funktionalen Schnittstelle.
2. Lambda-Syntax
Enthält drei Teile
1. Ein durch Kommas in Klammern getrennter formaler Parameter. Der Parameter ist der Parameter der Methode in der Funktionsschnittstelle.
2. Ein Pfeilsymbol: ->
3. Der Methodenkörper kann ein Ausdruck oder ein Codeblock sein. Wenn es sich um einen Codeblock handelt, ist ein Rückgabewert erforderlich Es gibt eine Ausnahme: Wenn der Rückgabewert der Methode in einer funktionalen Schnittstelle ungültig ist, wird {} nicht benötigt.
Insgesamt sieht es so aus:
Kopieren Sie den Codecode wie folgt:
(Parameter) -> Ausdruck oder (Parameter) -> { Anweisungen }
Sehen Sie sich zum besseren Verständnis ein vollständiges Beispiel an
Kopieren Sie den Codecode wie folgt:
/**
* Testen Sie den Lambda-Ausdruck
*
* @Autor benhail
*/
öffentliche Klasse TestLambda {
public static void runThreadUseLambda() {
//Runnable ist eine Funktionsschnittstelle, die nur eine Parameterlose Ausführungsmethode enthält, die void zurückgibt;
//Es gibt also keine Parameter auf der linken Seite des Lambda-Ausdrucks und keine Rückgabe auf der rechten Seite. Es wird lediglich ein Satz ausgegeben.
new Thread(() ->System.out.println("Thread implementiert von Lambda")).start();
}
public static void runThreadUseInnerClass() {
//Ich werde nicht viel über diese Methode sprechen. Es war ein üblicher Ansatz in alten Versionen.
neuer Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread implementiert durch interne Klasse");
}
}).Start();
}
public static void main(String[] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
Es ist ersichtlich, dass der mit Lambda-Ausdrücken entworfene Code prägnanter und lesbarer ist.
3. Methodenreferenz
Tatsächlich handelt es sich um eine vereinfachte Methode zum Schreiben des Lambda-Ausdrucks. Die Syntax ist ebenfalls sehr einfach. Die linke Seite ist der Container (kann ein Klassenname oder ein Instanzname sein). Die Mitte ist „::“ und die rechte Seite ist der entsprechende Methodenname. Wie unten gezeigt:
Kopieren Sie den Code wie folgt: ObjectReference::methodName
Das allgemeine Zitierformat für Methoden ist
Wenn es sich um eine statische Methode handelt, ist sie ClassName::methodName. Zum Beispiel Object::equals
Wenn es sich um eine Instanzmethode handelt, ist es Instance::methodName. Wie zum Beispiel Object obj=new Object();obj::equals;
Konstruktor. Es ist ClassName::new
Schauen wir uns zum besseren Verständnis ein vollständiges Beispiel an:
Kopieren Sie den Codecode wie folgt:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
*
* @Autor benhail
*/
öffentliche Klasse TestMethodReference {
public static void main(String[] args) {
JFrame-Frame = neuer JFrame();
frame.setLayout(new FlowLayout());
frame.setVisible(true);
JButton button1 = new JButton("Klick mich!");
JButton button2 = new JButton("Klick mich auch!");
frame.getContentPane().add(button1);
frame.getContentPane().add(button2);
// Der Parameter der addActionListener-Methode ist hier ActionListener, eine funktionale Schnittstelle
//Lambda-Ausdrucksmethode verwenden
button1.addActionListener(e -> { System.out.println("Hier ist die Lambda-Implementierung"); });
//Methodenreferenzmethode verwenden
button2.addActionListener(TestMethodReference::doSomething);
}
/**
* Hier ist die Implementierungsmethode der Funktionsschnittstelle ActionListener
* @param e
*/
public static void doSomething(ActionEvent e) {
System.out.println("Hier ist die Methodenreferenzimplementierung");
}
}
Es ist ersichtlich, dass die doSomething-Methode die Implementierung des Lambda-Ausdrucks ist. Der Vorteil besteht darin, dass die Methodenreferenz eine Lösung ist, wenn Sie der Meinung sind, dass die Lambda-Methode sehr lang ist und die Lesbarkeit des Codes beeinträchtigt.
4. Zusammenfassung
Das Obige ist der gesamte Inhalt der Lambda-Ausdrücke. Wenn der Code jedoch einfach ist, wird er nicht so aufregend sein Die Notwendigkeit, Lambda in Java 8 einzuführen, liegt daran, dass Lambda Ausdrücke können die Multithread- oder Multi-Core-Verarbeitung einer Sammlung vereinfachen und eine schnellere Verarbeitungsgeschwindigkeit der Sammlung ermöglichen. Diese Funktion von JEP126 wird in drei Teile unterteilt . Es gibt zu viele Dinge zum Schreiben. Im zweiten Teil geht es um den Inhalt virtueller Erweiterungsmethoden (Standardmethoden). Große Datensammlungen und Lösungen. Entdecken Sie die Leistungsfähigkeit von Lambda-Ausdrücken. Bleiben Sie dran. . . .