Java 8 wird als die am meisten veränderte Version in der Java -Geschichte bezeichnet. Es enthält viele wichtige neue Merkmale, der Kern ist die Zugabe von Lambda -Ausdrücken und Streamapi. Die beiden können auch zusammen verwendet werden. Schauen wir uns zunächst einen Blick auf einen Lambda -Ausdruck.
Durch die Verwendung von Lambda -Ausdrücken ist der Code nicht nur einfach, sondern auch lesbar, und vor allem nimmt die Menge an Code auch stark ab. In gewissem Maße wurden diese Funktionen jedoch in JVM -Sprachen wie Scala weit verbreitet.
Es ist nicht überraschend, dass die Scala -Community unglaublich ist, da viele Java 8 -Inhalte so aussehen, als wäre sie von Scala bewegt worden. In gewissem Maße ist die Syntax von Java 8 detaillierter, aber nicht sehr klar als die von Scala, aber das sagt nicht viel aus, und wenn es kann, kann es Lambda -Ausdrücke wie Scala aufbauen.
Einerseits ist Scala möglicherweise nicht erforderlich, wenn Java weiterhin Funktionen entwickelt und implementiert, die Scala bereits in Lambda implementiert hat. Wenn es jedoch nur einige Kernfunktionen bietet, wie z. B. die Unterstützung anonymer interner Klassen, werden Scala und andere Sprachen weiterhin gedeihen und Java überholen. In der Tat ist dies das beste Ergebnis. Nur mit dem Wettbewerb kann es Fortschritte geben. Andere Sprachen entwickeln sich weiter und wachsen, und es besteht keine Notwendigkeit, sich darüber Sorgen zu machen, ob sie veraltet sind.
Lambda -Ausdruck, die Erklärung zu Wikipedia ist ein Operator, mit dem anonyme Funktionen und Schließungen dargestellt werden. Ich bin der Meinung, dass diese Erklärung immer noch sehr abstrakt ist. Schauen wir uns ein Beispiel an.
public class swingest {public static void main (String [] args) {jframe jframe = new JFrame ("my JFrame"); Jbutton Jbutton = New Jbutton ("My Jbutton"); jbutton.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {System.out.println ("Taste gedrückt!");}}); Jframe.add (Jbutton); Jframe.pack (); JFrame.setVisible (true); jframe.setDefaultCloseOperation (jframe.exit_on_close); }}Dies ist ein Code in der Swing -Programmierung, das ein Hörereignis an die Schaltfläche bindet. Wenn die Schaltfläche klickt, ist der Inhalt "Buttondruck!" wird auf der Konsole ausgegeben. Hier erstellen wir eine Instanz einer anonymen inneren Klasse, um an den Hörer zu binden, was in der Vergangenheit auch eine relativ häufige Form des Codesorganisation ist. Wenn wir jedoch genau hinschauen, werden wir feststellen, dass wir uns wirklich darauf konzentrieren, dass wir uns wirklich konzentrieren, einen Parameter E des Action -Event -Typs und das Anweisungssystem.out.println ("Buttonpression!"); Ausgabe in die Konsole.
Wenn der Code im vorherigen Programm, der eine anonyme interne Klasse erstellt, durch einen Lambda -Ausdruck ersetzt wird, ist der Code wie folgt
public class swingest {public static void main (String [] args) {jframe jframe = new JFrame ("my JFrame"); Jbutton Jbutton = New Jbutton ("My Jbutton"); jbutton.addactionListener (e -> system.out.println ("Taste gedrückt!")); Jframe.add (Jbutton); Jframe.pack (); JFrame.setVisible (true); jframe.setDefaultCloseOperation (jframe.exit_on_close);}} Achten Sie auf die Änderungen im mittleren Teil des Codes, aus den ursprünglichen 6 Codezeilen, jetzt kann 1 Zeile implementiert werden. Dies ist eine einfache Form des Lambda -Ausdrucks.
Es ist ersichtlich, dass die Syntax des Lambda -Ausdrucks ist
(Param1, Param2, Param3) -> {// Todo}Das Typ -Programm des Parameters hier kann basierend auf dem Kontext abgeleitet werden, aber nicht alle Typen können abgeleitet werden. Zu diesem Zeitpunkt müssen wir den deklarierten Parametertyp anzeigen. Wenn es nur einen Parameter gibt, können die Klammern weggelassen werden. Wenn der Todo -Teil nur eine Codezeile hat, können die Zahnspangen von außen weggelassen werden. Wie in unserem Beispiel oben
Bringt uns Lambda -Ausdruck zusätzlich zum prägnanten Code Änderungen?
Erinnern wir uns, dass wir in Java keine Funktion als Parameter an eine Methode übergeben können, und wir können auch nicht erklären, dass der Rückgabewert eine Methode einer Funktion ist. Vor Java 8 war die Antwort ja.
Im obigen Beispiel können wir also tatsächlich eine Codelogik als Parameter an den Hörer übergeben und dem Hörer mitgeteilt, dass Sie dies tun können, wenn das Ereignis ausgelöst wird, ohne dass anonyme interne Klassen als Parameter verwendet werden müssen. Dies ist auch ein weiteres neues Feature, das von Java 8: Funktionalprogrammierung mitgebracht wurde.
Es gibt viele Sprachen, die die funktionale Programmierung unterstützen. In JavaScript ist es sehr häufig, Funktionen als Parameter oder Rückgabeteile als Funktionen zu übergeben. JavaScript ist eine sehr häufige funktionale Sprache.
Lambda fügt Java fehlende funktionale Programmierfunktionen hinzu, sodass wir Funktionen als erstklassige Bürger behandeln können.
In funktionalen Programmiersprachen ist der Typ eines Lambda -Ausdrucks eine Funktion. In Java sind Lambda -Ausdrücke Objekte und müssen an eine spezielle Objekttyp -Funktionsschnittstelle angeschlossen werden.
Schauen wir uns als nächstes die Definition der funktionalen Schnittstelle an:
Wenn es in einer Schnittstelle und nur eine abstrakte Methode gibt (die Methoden in der Objektklasse sind nicht enthalten), kann diese Schnittstelle als funktionale Schnittstelle angesehen werden.
@FunctionalInterfacepublic Interface Runnable {/** * Wenn ein Objekt eine Schnittstelle <code> runnable </code> verwendet wird *, um einen Thread zu erstellen, führt das Starten des Threads * <Code> Ausführen </code> in diesem separat ausführenden * Thread des Objekts. * <p> * Der allgemeine Vertrag der Methode <Code> Ausführen </code> ist, dass er irgendwelche Maßnahmen ergreifen kann. * * @see java.lang.thread#run () */ public abstract void run ();}Schauen wir uns die Aussage der Runnable -Schnittstelle an. Nach Java 8 verfügt die Runnable -Schnittstelle über eine zusätzliche funktionalinterface -Annotation, die angibt, dass die Schnittstelle eine funktionale Schnittstelle ist. Wenn wir jedoch keine funktionalinterface -Annotation hinzufügen, wird der Compiler die Schnittstelle auch als funktionale Schnittstelle als funktionale Schnittstelle angesehen, wenn es nur eine abstrakte Methode gibt.
@FunctionalInterfacepublic Schnittstelle myInterface {void test (); String toString ();}MyInterface ist auch eine funktionale Schnittstelle, da ToString () eine Methode in der Objektklasse ist, aber hier umgeschrieben wird und die Anzahl der abstrakten Methoden in der Schnittstelle nicht erhöht.
(Um hier in Java 8 zu erwähnen, können die Methoden in der Schnittstelle nicht nur abstrakte Methoden haben, sondern auch spezifische implementierte Methoden. Sie werden als Standardmethoden bezeichnet, die später ausführlich eingeführt werden.)
Seit in Java sind Lambda -Ausdrücke Objekte. Was ist der Typ dieses Objekts? Lassen Sie uns das SwingTest -Programm überprüfen, in dem eine ActionListener -Schnittstelle in einer anonymen internen Klasse erstellt wird.
jbutton.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {System.out.println ("Taste gedrückt!");}});Verbessert mit Lambda -Ausdruck
jbutton.addactionListener (e -> system.out.println ("Taste gedrückt!"));Das heißt, wir verwenden den Lambda -Ausdruck, um eine Instanz der ActionListener -Schnittstelle zu erstellen und dann die Definition der ActionListener -Schnittstelle zu betrachten.
public interface actionListener erweitert EventListener { /***, wenn eine Aktion auftritt. */ public void actionperformed (actionEvent e);} Es gibt nur eine abstrakte Methode. Obwohl die Annotation von Funktionsinterface nicht hinzugefügt wird, entspricht sie auch der Definition einer funktionalen Schnittstelle. Der Compiler wird dies als eine funktionale Schnittstelle betrachten.
Daher kann die Verwendung von Lambda -Ausdrücken Instanzen von funktionalen Schnittstellen erstellen. Das heißt, der Lambda -Ausdruck gibt einen funktionalen Schnittstellentyp zurück.
Tatsächlich gibt es drei Möglichkeiten, funktionale Schnittstelleninstanzen zu erstellen (siehe Annotation von FunctionalInterface):
1. Lambda Ausdrücke
2. Methodenzitat
3. Referenz für Konstruktionsmethoden
Zusammenfassen
In diesem Artikel geht es um diesen Artikel über das einfache Verständnis von Lambda und funktionale Schnittstellen von Java 8. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen!