prominent java 8 features with code examples
Eine umfassende Liste und Erläuterung aller wichtigen Funktionen, die in Java 8 Release eingeführt wurden, mit Beispielen:
Die Java 8-Version von Oracle war eine revolutionäre Version der weltweit führenden Entwicklungsplattform. Es beinhaltete ein großes Upgrade des Java-Programmiermodells als Ganzes sowie die koordinierte Weiterentwicklung von JVM, Java-Sprache und Bibliotheken.
Diese Version enthielt mehrere Funktionen für Benutzerfreundlichkeit, Produktivität, verbesserte Polyglot-Programmierung, Sicherheit und insgesamt verbesserte Leistung.
Was du lernen wirst:
- Zu Java 8 Release hinzugefügte Funktionen
- Funktionale Schnittstellen und Lambda-Ausdrücke
- forEach () -Methode in iterierbarer Schnittstelle
- Optionale Klasse
- Standard- und statische Methoden in Schnittstellen
- Methodenreferenzen
- Java Stream API für Massendatenoperationen in Sammlungen
- Java Date Time API
- Nashorn JavaScript Engine
- Base64 Encode Decode
- Verbesserungen der Sammlungs-API
- Änderungen / Verbesserungen der Parallelitäts-API
- Java IO-Verbesserungen
- Verschiedene Verbesserungen der Core-API
- Fazit
Zu Java 8 Release hinzugefügte Funktionen
Unter den wichtigsten Änderungen sind die folgenden bemerkenswerten Funktionen, die dieser Version hinzugefügt wurden.
- Funktionsschnittstellen und Lambda-Ausdrücke
- forEach () -Methode in der Iterable-Schnittstelle
- Optionale Klasse,
- Standard- und statische Methoden in Schnittstellen
- Methodenreferenzen
- Java Stream API für Massendatenoperationen in Sammlungen
- Java Date Time API
- Verbesserungen der Sammlungs-API
- Verbesserungen der Parallelitäts-API
- Java IO Verbesserungen
- Nashorn JavaScript engine
- Base64 Encode Decode
- Verschiedene Verbesserungen der Core-API
In diesem Tutorial werden wir jede dieser Funktionen kurz diskutieren und versuchen, sie anhand einfacher und einfacher Beispiele zu erklären.
Funktionale Schnittstellen und Lambda-Ausdrücke
Java 8 führt eine Annotation ein, die als @FunctionalInterface bekannt ist und normalerweise für Fehler auf Compilerebene gilt. Es wird normalerweise verwendet, wenn die von Ihnen verwendete Schnittstelle gegen die Verträge der funktionalen Schnittstelle verstößt.
Alternativ können Sie eine Funktionsschnittstelle als SAM-Schnittstelle oder Single Abstract Method-Schnittstelle aufrufen. Eine funktionale Schnittstelle erlaubt genau eine „abstrakte Methode“ als Mitglied.
Nachfolgend finden Sie ein Beispiel für eine funktionale Schnittstelle:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); }
Sie können die Anmerkung weglassen, @FunctionalInterface und Ihre funktionale Schnittstelle bleibt weiterhin gültig. Wir verwenden diese Annotation nur, um den Compiler darüber zu informieren, dass die Schnittstelle eine einzige abstrakte Methode hat.
Hinweis: Standardmäßig sind Standardmethoden nicht abstrakt und Sie können der Funktionsoberfläche beliebig viele Standardmethoden hinzufügen.
Zweitens, wenn eine Schnittstelle eine abstrakte Methode hat, die eine der öffentlichen Methoden von 'java.lang.object' überschreibt, wird sie nicht als abstrakte Methode der Schnittstelle betrachtet.
Im Folgenden finden Sie ein gültiges Beispiel für eine funktionale Schnittstelle.
@FunctionalInterface public interface FunctionalInterface_one { public void firstInt_method(); @Override public String toString(); //Overridden from Object class @Override public boolean equals(Object obj); //Overridden from Object class }
Ein Lambda-Ausdruck (oder eine Lambda-Funktion) kann als anonyme Funktion definiert werden (eine Funktion ohne Namen und ohne Kennung). Lambda-Ausdrücke werden genau dort definiert, wo sie benötigt werden, normalerweise als Parameter für eine andere Funktion.
Aus einer anderen Perspektive drücken Lambda-Ausdrücke Instanzen von aus Funktionsschnittstellen (oben beschrieben). Lambda-Ausdrücke implementieren die einzige abstrakte Funktion, die in der Funktionsschnittstelle vorhanden ist, und implementieren somit Funktionsschnittstellen.
Die grundlegende Syntax eines Lambda-Ausdrucks lautet:
Ein grundlegendes Beispiel für den Lambda-Ausdruck ist:
Der obige Ausdruck nimmt zwei Parameter x und y und gibt seine Summe x + y zurück. Basierend auf dem Datentyp von x und y kann die Methode an verschiedenen Stellen mehrfach verwendet werden. Daher stimmen die Parameter x und y mit int oder Integer und string überein. Je nach Kontext werden zwei Ganzzahlen hinzugefügt (wenn die Parameter int sind) oder die beiden Zeichenfolgen (wenn die Parameter eine Zeichenfolge sind) zusammengefasst.
Implementieren wir ein Programm, das Lambda Expressions demonstriert.
interface MyInterface { void abstract_func(int x,int y); default void default_Fun() { System.out.println('This is default method'); } } class Main { public static void main(String args()) { //lambda expression MyInterface fobj = (int x, int y)->System.out.println(x+y); System.out.print('The result = '); fobj.abstract_func(5,5); fobj.default_Fun(); } }
Ausgabe:
Das obige Programm zeigt die Verwendung von Lambda-Ausdruck zum Hinzufügen zu Parametern und zeigt deren Summe an. Dann implementieren wir damit die abstrakte Methode 'abstract_fun', die wir in der Schnittstellendefinition deklariert haben. Das Ergebnis des Aufrufs der Funktion 'abstract_fun' ist die Summe der beiden Ganzzahlen, die beim Aufruf der Funktion als Parameter übergeben wurden.
Wir werden später im Tutorial mehr über Lambda Expressions erfahren.
forEach () -Methode in iterierbarer Schnittstelle
Java 8 hat in der Schnittstelle java.lang.Iterable eine 'forEach' -Methode eingeführt, die über die Elemente in der Auflistung iterieren kann. 'ForEach' ist eine Standardmethode, die in der Iterable-Schnittstelle definiert ist. Es wird von den Collection-Klassen verwendet, die die Iterable-Schnittstelle erweitern, um Elemente zu iterieren.
Die 'forEach' -Methode verwendet die Funktionsschnittstelle als einen einzelnen Parameter, d. H. Sie können den Lambda-Ausdruck als Argument übergeben.
Beispiel für die forEach () -Methode.
importjava.util.ArrayList; importjava.util.List; public class Main { public static void main(String() args) { List subList = new ArrayList(); subList.add('Maths'); subList.add('English'); subList.add('French'); subList.add('Sanskrit'); subList.add('Abacus'); System.out.println('------------Subject List--------------'); subList.forEach(sub -> System.out.println(sub)); } }
Ausgabe:
Wir haben also eine Sammlung von Themen, d. H. Unterliste. Wir zeigen den Inhalt der Unterliste mit der forEach-Methode an, die Lambda-Ausdruck verwendet, um jedes Element zu drucken.
Programme zur Überwachung der CPU- und GPU-Temperatur
Optionale Klasse
Java 8 hat eine optionale Klasse im Paket 'java.util' eingeführt. 'Optional' ist eine öffentliche Abschlussklasse und wird verwendet, um mit NullPointerException in der Java-Anwendung umzugehen. Mit Optional können Sie alternativen Code oder alternative Werte angeben, die ausgeführt werden sollen. Wenn Sie Optional verwenden, müssen Sie nicht zu viele Nullprüfungen verwenden, um nullPointerException zu vermeiden.
Sie können die Klasse Optional verwenden, um ein abnormales Beenden des Programms zu vermeiden und einen Absturz des Programms zu verhindern. Die optionale Klasse bietet Methoden, mit denen das Vorhandensein von Werten für eine bestimmte Variable überprüft wird.
Das folgende Programm demonstriert die Verwendung der optionalen Klasse.
import java.util.Optional; public class Main{ public static void main(String() args) { String() str = new String(10); OptionalcheckNull = Optional.ofNullable(str(5)); if (checkNull.isPresent()) { String word = str(5).toLowerCase(); System.out.print(str); } else System.out.println('string is null'); } }
Ausgabe:
In diesem Programm verwenden wir die Eigenschaft 'ofNullable' der Klasse 'Optional', um zu überprüfen, ob die Zeichenfolge null ist. Wenn dies der Fall ist, wird die entsprechende Nachricht an den Benutzer gedruckt.
Standard- und statische Methoden in Schnittstellen
In Java 8 können Sie der Schnittstelle Methoden hinzufügen, die nicht abstrakt sind, d. H. Sie können Schnittstellen zur Methodenimplementierung haben. Mit dem Schlüsselwort Default und Static können Sie Schnittstellen zur Methodenimplementierung erstellen. Standardmethoden aktivieren hauptsächlich die Lambda-Ausdrucksfunktionalität.
Mit Standardmethoden können Sie Ihren Schnittstellen in Ihren Bibliotheken neue Funktionen hinzufügen. Dadurch wird sichergestellt, dass der für die älteren Versionen geschriebene Code mit diesen Schnittstellen kompatibel ist (Binärkompatibilität).
Lassen Sie uns die Standardmethode anhand eines Beispiels verstehen:
import java.util.Optional; interface interface_default { default void default_method(){ System.out.println('I am default method of interface'); } } class derived_class implements interface_default{ } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); obj1.default_method(); } }
Ausgabe:
Wir haben eine Schnittstelle namens 'interface_default' mit der Methode default_method () mit einer Standardimplementierung. Als nächstes definieren wir eine Klasse 'derivative_class', die die Schnittstelle 'interface_default' implementiert.
Beachten Sie, dass wir in dieser Klasse keine Schnittstellenmethoden implementiert haben. Dann erstellen wir in der Hauptfunktion ein Objekt der Klasse 'derivative_class' und rufen direkt die 'default_method' der Schnittstelle auf, ohne sie in der Klasse definieren zu müssen.
Dies ist die Verwendung von Standard- und statischen Methoden in der Schnittstelle. Wenn eine Klasse die Standardmethode anpassen möchte, können Sie eine eigene Implementierung bereitstellen, indem Sie die Methode überschreiben.
Methodenreferenzen
Die in Java 8 eingeführte Methodenreferenzfunktion ist eine Kurzschreibweise für Lambda-Ausdrücke zum Aufrufen einer Methode der funktionalen Schnittstelle. Jedes Mal, wenn Sie einen Lambda-Ausdruck zum Verweisen auf eine Methode verwenden, können Sie Ihren Lambda-Ausdruck durch eine Methodenreferenz ersetzen.
dijkstras Implementierung des Algorithmus für kürzeste Wege in Java
Beispiel einer Methodenreferenz.
import java.util.Optional; interface interface_default { void display(); } class derived_class{ public void classMethod(){ System.out.println('Derived class Method'); } } class Main{ public static void main(String() args){ derived_class obj1 = new derived_class(); interface_default ref = obj1::classMethod; ref.display(); } }
Ausgabe:
In diesem Programm haben wir eine Schnittstelle 'interface_default' mit einer abstrakten Methode 'display ()'. Als nächstes gibt es eine Klasse 'derivative_class' mit einer öffentlichen Methode 'classMethod', die eine Nachricht druckt.
In der Hauptfunktion haben wir ein Objekt für die Klasse und dann einen Verweis auf die Schnittstelle, die über obj1 (Klassenobjekt) auf eine Klassenmethode „classMethod“ verweist. Wenn nun die Anzeige der abstrakten Methode als Schnittstellenreferenz aufgerufen wird, wird der Inhalt von classMethod angezeigt.
Java Stream API für Massendatenoperationen in Sammlungen
Die Stream-API ist eine weitere wichtige Änderung, die in Java 8 eingeführt wurde. Die Stream-API wird zur Verarbeitung der Sammlung von Objekten verwendet und unterstützt eine andere Art der Iteration. Ein Stream ist eine Folge von Objekten (Elementen), mit denen Sie verschiedene Methoden routen können, um die gewünschten Ergebnisse zu erzielen.
Ein Stream ist keine Datenstruktur und empfängt seine Eingaben von Sammlungen, Arrays oder anderen Kanälen. Wir können verschiedene Zwischenoperationen mit Streams weiterleiten, und die Terminaloperationen geben das Ergebnis zurück. Wir werden die Stream-API in einem separaten Java-Tutorial ausführlicher behandeln.
Java Date Time API
Java 8 führt eine neue Datums- / Uhrzeit-API unter dem Paket java.time ein.
Die wichtigsten Klassen unter ihnen sind:
- Lokal: Vereinfachte Datums- / Uhrzeit-API ohne Komplexität der Zeitzonenbehandlung.
- Zoniert: Spezielle Datums- / Uhrzeit-API für verschiedene Zeitzonen.
Termine
Die Datumsklasse ist in Java 8 veraltet.
Es folgen die neuen Klassen:
- Die LocalDate-Klasse definiert ein Datum. Es gibt keine Darstellung für Zeit oder Zeitzone.
- Die LocalTime Klasse definiert eine Zeit. Es gibt keine Darstellung für Datum oder Zeitzone.
- Die LocalDateTime-Klasse definiert ein Datum und eine Uhrzeit. Es gibt keine Darstellung einer Zeitzone.
Um Zeitzoneninformationen mit Datumsfunktionalität einzuschließen, können Sie Lambda verwenden, das drei Klassen bereitstellt, d. H. OffsetDate, OffsetTime und OffsetDateTime. Hier wird der Zeitzonenversatz mit einer anderen Klasse dargestellt - 'ZoneId'. Wir werden dieses Thema in den späteren Teilen dieser Java-Reihe ausführlich behandeln.
Nashorn JavaScript Engine
Java 8 führte eine stark verbesserte Engine für JavaScript ein, d. H. Nashorn, die das vorhandene Rhino ersetzt. Nashorn kompiliert den Code direkt im Speicher und übergibt den Bytecode an JVM, wodurch die Leistung um das Zehnfache verbessert wird.
Nashorn führt ein neues Befehlszeilentool ein - jjs, das JavaScript-Code auf der Konsole ausführt.
Erstellen wir eine JavaScript-Datei 'sample.js', die den folgenden Code enthält.
print (‘Hello, World!!’);
Geben Sie den folgenden Befehl in der Konsole ein:
C: Java jjs sample.js
Ausgabe: Hallo Welt!!
Wir können JavaScript-Programme auch im interaktiven Modus ausführen und den Programmen Argumente liefern.
Base64 Encode Decode
In Java 8 gibt es eine integrierte Codierung und Decodierung für die Base64-Codierung. Die Klasse für die Base64-Codierung lautet java.util.Base64.
Diese Klasse bietet drei Base64-Codierungen und -Decoder:
- Basic: Dabei wird die Ausgabe einem Zeichensatz zwischen A-Za-z0-9 + / zugeordnet. Der Ausgang wird vom Codierer nicht mit Zeilenvorschub versehen, und der Decodierer lehnt andere Zeichen als die oben genannten ab.
- URL: Hier ist die Ausgabe die URL und der Dateiname sicher wird dem Zeichensatz zwischen A-Za-z0-9 + / zugeordnet.
- MIME: Bei diesem Encodertyp wird die Ausgabe einem MIME-freundlichen Format zugeordnet.
Verbesserungen der Sammlungs-API
Java 8 hat der Sammlungs-API die folgenden neuen Methoden hinzugefügt:
- forEachRemaining (Consumer-Aktion): Dies ist eine Standardmethode für den Iterator. Es führt die 'Aktion' für jedes der verbleibenden Elemente aus, bis alle Elemente verarbeitet sind oder 'Aktion' eine Ausnahme auslöst.
- Die Standardmethode für die Sammlung removeIf (Prädikatfilter): Hiermit werden alle Elemente in der Sammlung entfernt, die den angegebenen „Filter“ erfüllen.
- Spliterator (): Dies ist eine Erfassungsmethode und gibt eine Spliterator-Instanz zurück, mit der Sie die Elemente entweder sequentiell oder parallel durchlaufen können.
- Die Kartensammlung verfügt über die Methoden replaceAll (), compute () und merge ().
- Die HashMap-Klasse mit Schlüsselkollisionen wurde verbessert, um die Leistung zu verbessern.
Änderungen / Verbesserungen der Parallelitäts-API
Im Folgenden sind die wichtigen Verbesserungen der Concurrent API aufgeführt:
- ConcurrentHashMap wird mit den folgenden Methoden erweitert:
- berechnen (),
- für jedes (),
- forEachEntry (),
- forEachKey (),
- forEachValue (),
- gehen (),
- reduzieren () und
- Suche ()
- Die Methode 'newWorkStealingPool ()' für Ausführende erstellt einen Thread, der die Arbeit stiehlt. Es verwendet die verfügbaren Prozessoren als Zielparallelitätsstufe.
- Die Methode „completeableFuture“ können explizit abgeschlossen werden (indem der Wert und der Status festgelegt werden).
Java IO-Verbesserungen
Zu den in Java 8 vorgenommenen E / A-Verbesserungen gehören:
- Files.list (Pfadverzeichnis): Dies gibt einen jlazily aufgefüllten Stream zurück, dessen jedes Element der Eintrag im Verzeichnis ist.
- Files.lines (Pfadpfad): Liest alle Zeilen aus einem Stream.
- Files.find (): Suchen Sie im Dateibaum nach Dateien, die auf einer bestimmten Startdatei basieren, und geben Sie einen Stream zurück, der mit einem Pfad gefüllt ist.
- BufferedReader.lines (): Gibt einen Stream mit jedem Element zurück, während die Zeilen aus BufferedReader gelesen werden.
Verschiedene Verbesserungen der Core-API
Wir haben die folgenden verschiedenen API-Verbesserungen:
- Statische Methode mit Initial (Lieferantenlieferant) von ThreadLocal zum einfachen Erstellen einer Instanz.
- Die Schnittstelle „Komparator“ wird um die Standard- und statischen Methoden für die natürliche Reihenfolge umgekehrter Reihenfolge usw. erweitert.
- Integer-, Long- und Double-Wrapper-Klassen haben die Methoden min (), max () und sum ().
- Die Boolesche Klasse wird mit den Methoden LogicAnd (), LogicalOr () und LogicalXor () erweitert.
- In der Math-Klasse werden verschiedene Dienstprogrammmethoden vorgestellt.
- JDBC-ODBC-Brücke wird entfernt.
- Der PermGen-Speicherplatz wird entfernt.
Fazit
In diesem Tutorial haben wir die wichtigsten Funktionen erläutert, die der Java 8-Version hinzugefügt wurden. Da Java 8 eine Hauptversion von Java ist, ist es wichtig, dass Sie alle Funktionen und Verbesserungen kennen, die im Rahmen dieser Version vorgenommen wurden.
Obwohl die neueste Java-Version 13 ist, ist es immer noch eine gute Idee, sich mit den Java 8-Funktionen vertraut zu machen. Alle in diesem Lernprogramm beschriebenen Funktionen sind in der neuesten Java-Version noch vorhanden, und wir werden sie später in dieser Reihe als einzelne Themen behandeln.
Wir hoffen, dass dieses Tutorial Ihnen geholfen hat, verschiedene Java 8-Funktionen kennenzulernen !!
Literatur-Empfehlungen
- Java Array Length Tutorial mit Codebeispielen
- Java 'this' Schlüsselwort: Tutorial mit Codebeispielen
- Java Interface und Abstract Class Tutorial mit Beispielen
- JAVA-Tutorial für Anfänger: Über 100 praktische Java-Video-Tutorials
- Java-Bereitstellung: Erstellung und Ausführung einer Java-JAR-Datei
- C ++ Vs Java: Top 30 Unterschiede zwischen C ++ und Java mit Beispielen
- MongoDB Sort () -Methode mit Beispielen
- Entdecken Sie die Grundlagen von Java in Selen anhand von Beispielen