Java 9 ist ein wichtiges Release und es hat uns viele Funktionen für Entwickler gebracht. In diesem Artikel werden wir uns die Java 9 Funktionen im Detail ansehen.
Java 10 wurde veröffentlicht. Für eine vollständige Übersicht über das Java 10 Release, lesen Sie bitte Java 10 Funktionen.
Java 9 Funktionen
Einige der wichtigen Java 9 Funktionen sind;
- Java 9 REPL (JShell)
- Factory-Methoden für unveränderliche Liste, Set, Map und Map.Entry
- Private Methoden in Interfaces
- Java 9 Modulsystem
- Verbesserungen der Process-API
- Verbesserung des Try-With-Resources
- Verbesserungen der CompletableFuture-API
- Reaktive Streams
- Diamantoperator für anonyme innere Klassen
- Verbesserungen der Optional-Klasse
- Verbesserungen der Stream-API
- Verbesserte @Deprecated Annotation
- HTTP 2 Client
- Multi-Resolution Image API
- Andere Java 9 Funktionen
Die Oracle Corporation wird voraussichtlich Java SE 9 gegen Ende März 2017 veröffentlichen. In diesem Beitrag werde ich „Java 9 Features“ kurz mit einigen Beispielen besprechen.
Java 9 REPL (JShell)
Oracle Corp hat ein neues Tool namens „jshell“ eingeführt. Es steht für Java-Shell und ist auch als REPL (Read Evaluate Print Loop) bekannt. Es wird verwendet, um beliebige Java-Konstrukte wie Klasse, Schnittstelle, Aufzählungstyp, Objekt, Anweisungen usw. sehr einfach auszuführen und zu testen. Wir können die JDK 9 EA (Early Access) Software von https://jdk9.java.net/download/
G:\>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> int a = 10
a ==> 10
jshell> System.out.println("a value = " + a )
a value = 10
herunterladen. Wenn Sie mehr über das REPL-Tool erfahren möchten, lesen Sie bitte Java 9 REPL Basics (Teil 1) und Java 9 REPL Features (Teil 2).
Factory-Methoden für unveränderliche Listen, Sets, Maps und Map.Entry
Oracle Corp hat einige praktische Factory-Methoden eingeführt, um unveränderliche List-, Set-, Map- und Map.Entry-Objekte zu erstellen. Diese Hilfsmethoden werden verwendet, um leere oder nicht leere Collection-Objekte zu erstellen. In Java SE 8 und früheren Versionen können wir die Utility-Methoden der Collections-Klasse wie unmodifiableXXX
verwenden, um unveränderliche Collection-Objekte zu erstellen. Wenn wir beispielsweise eine unveränderliche Liste erstellen möchten, können wir die Methode Collections.unmodifiableList
verwenden. Diese Collections.unmodifiableXXX
-Methoden sind jedoch ein umständlicher und ausführlicher Ansatz. Um diese Mängel zu überwinden, hat Oracle Corp einige Hilfsmethoden zu den Schnittstellen List, Set und Map hinzugefügt. Die Schnittstellen List und Set verfügen über „of()“ -Methoden, um leere oder nicht leere unveränderliche Listen- oder Set-Objekte zu erstellen, wie unten gezeigt: Leeres Listenbeispiel
List immutableList = List.of();
Nicht leeres Listenbeispiel
List immutableList = List.of("one","two","three");
Die Map verfügt über zwei Sätze von Methoden: of()
-Methoden und ofEntries()
-Methoden, um ein unveränderliches Map-Objekt bzw. ein unveränderliches Map.Entry-Objekt zu erstellen. Leeres Map-Beispiel
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
Nicht leeres Map-Beispiel
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
Wenn Sie mehr über diese Hilfsmethoden erfahren möchten, lesen Sie bitte die folgenden Links:
- Java 9 Factory Methoden für Immutable Liste
- Java 9 Factory Methoden für Immutable Set
- Java 9 Factory Methoden für Immutable Map und Map.Entry
Private Methoden in Schnittstellen
In Java 8 können wir Methodenimplementierung in Schnittstellen mithilfe von Standard- und statischen Methoden bereitstellen. Es ist jedoch nicht möglich, private Methoden in Schnittstellen zu erstellen. Um redundanten Code zu vermeiden und die Wiederverwendbarkeit zu erhöhen, plant Oracle Corp, private Methoden in Java SE 9-Schnittstellen einzuführen. Ab Java SE 9 können wir private und private statische Methoden in einer Schnittstelle mithilfe des Schlüsselworts „private“ schreiben. Diese privaten Methoden sind wie andere private Methoden von Klassen, es gibt keinen Unterschied zwischen ihnen.
public interface Card{
private Long createCardID(){
// Methodenimplementierung hier.
}
private static void displayCardDetails(){
// Methodenimplementierung hier.
}
}
Wenn Sie mehr über dieses neue Feature erfahren möchten, lesen Sie bitte diesen Link: Java 9 Private Methoden in Schnittstellen.
Java 9 Modulsystem
Eine der großen Änderungen oder Funktionen von Java 9 ist das Modulsystem. Die Oracle Corp wird die folgenden Funktionen als Teil des Jigsaw-Projekts einführen.
- Modulares JDK
- Modularer Java-Quellcode
- Modulare Laufzeitbilder
- Java-Interne APIs kapseln
- Java Platform Module System
Vor Java SE 9-Versionen verwenden wir monolithische JARs zur Entwicklung von Java-basierten Anwendungen. Diese Architektur hat viele Einschränkungen und Nachteile. Um all diese Nachteile zu vermeiden, kommt Java SE 9 mit dem Modulsystem. JDK 9 wird mit 92 Modulen geliefert (kann sich in der endgültigen Version ändern). Wir können JDK-Module verwenden und auch unsere eigenen Module erstellen, wie unten gezeigt: Einfaches Modulbeispiel
module com.foo.bar { }
Hier verwenden wir „Modul“, um ein einfaches Modul zu erstellen. Jedes Modul hat einen Namen, zugehörigen Code und andere Ressourcen. Um weitere Details zu dieser neuen Architektur und praktische Erfahrungen zu erhalten, lesen Sie bitte meine Original-Tutorials hier:
- Java 9 Modulsystem Grundlagen
- Java 9 Modulbeispiele mit Befehlszeile
- Java 9 Hallo Welt Modul Beispiel mit Eclipse IDE
Verbesserungen der Prozess-API
Java SE 9 kommt mit einigen Verbesserungen in der Prozess-API. Sie haben ein paar neue Klassen und Methoden hinzugefügt, um die Steuerung und Verwaltung von Betriebssystemprozessen zu erleichtern. Zwei neue Schnittstellen in der Prozess-API:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
Beispiel für die Prozess-API
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
Verbesserung bei der Verwendung von Ressourcen
Wir wissen, dass Java SE 7 eine neue Ausnahmebehandlungskonstruktion eingeführt hat: Try-With-Resources, um Ressourcen automatisch zu verwalten. Das Hauptziel dieser neuen Anweisung ist „Automatisches besseres Ressourcenmanagement“. Java SE 9 wird einige Verbesserungen an dieser Anweisung vornehmen, um etwas mehr Redundanz zu vermeiden und die Lesbarkeit zu verbessern. Beispiel für Java SE 7
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}
Beispiel für Java 9
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
Um mehr über dieses neue Feature zu erfahren, lesen Sie bitte mein Original-Tutorial unter: Java 9 Try-With-Resources Verbesserungen
CompletableFuture API Verbesserungen
In Java SE 9 wird Oracle Corp die CompletableFuture-API verbessern, um einige Probleme zu lösen, die in Java SE 8 aufgetreten sind. Sie werden Unterstützung für einige Verzögerungen und Timeouts hinzufügen, einige Hilfsmethoden und eine bessere Unterklasse unterstützen.
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
Hier ist delayedExecutor() eine statische Hilfsmethode, die verwendet wird, um einen neuen Executor zurückzugeben, der eine Aufgabe nach der angegebenen Verzögerung an den Standardexecutor sendet.
Reactive Streams
Heutzutage ist Reaktives Programmieren sehr beliebt bei der Entwicklung von Anwendungen, um einige schöne Vorteile zu erzielen. Scala, Play, Akka usw. Frameworks haben bereits Reactive Streams integriert und erzielen viele Vorteile. Auch Oracle Corps führt eine neue Reactive Streams API in Java SE 9 ein. Die Reactive Streams API von Java SE 9 ist ein Publish/Subscribe-Framework zur Implementierung von asynchronen, skalierbaren und parallelen Anwendungen sehr einfach mit der Java-Sprache. Java SE 9 hat die folgende API eingeführt, um Reactive Streams in Java-basierten Anwendungen zu entwickeln.
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
Mehr lesen unter Java 9 Reactive Streams.
Diamant-Operator für anonyme innere Klasse
Wir wissen, dass Java SE 7 eine neue Funktion eingeführt hat: den Diamant-Operator, um redundanten Code und Überflüssigkeit zu vermeiden und die Lesbarkeit zu verbessern. Allerdings hat Oracle Corp (Java Library Developer) in Java SE 8 festgestellt, dass es einige Einschränkungen bei der Verwendung des Diamant-Operators mit anonymen inneren Klassen gibt. Diese Probleme wurden behoben und sollen als Teil von Java 9 veröffentlicht werden.
public List getEmployee(String empid){
// Code zum Abrufen von Mitarbeiterdetails aus dem Datenspeicher
return new List(emp){ };
}
Hier verwenden wir nur „List“ ohne Angabe des Typparameters.
Verbesserungen der Optional-Klasse
In Java SE 9 hat Oracle Corp einige nützliche neue Methoden zur java.util.Optional-Klasse hinzugefügt. Hier werde ich eine dieser Methoden mit einem einfachen Beispiel diskutieren: die `stream`-Methode. Wenn ein Wert im gegebenen Optional-Objekt vorhanden ist, gibt diese Methode einen sequentiellen Stream mit diesem Wert zurück. Andernfalls wird ein leerer Stream zurückgegeben. Sie haben die Methode „stream()“ hinzugefügt, um an Optional-Objekten träge zu arbeiten, wie unten gezeigt:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
Hier wird die Optional.stream()-Methode verwendet, um einen Stream von Optional von Employee-Objekten in einen Stream von Employee zu konvertieren, damit wir an diesem Ergebnis träge im Resultatcode arbeiten können. Um mehr über dieses Feature mit weiteren Beispielen zu erfahren und mehr neue Methoden, die zur Optional-Klasse hinzugefügt wurden, zu lesen, lesen Sie bitte mein Original-Tutorial unter:
Java SE 9: Verbesserungen der Optional-Klasse
Verbesserungen der Stream-API
In Java SE 9 hat Oracle Corp vier nützliche neue Methoden zur java.util.Stream-Schnittstelle hinzugefügt. Da Stream eine Schnittstelle ist, handelt es sich bei allen diesen neuen implementierten Methoden um Standardmethoden. Zwei davon sind sehr wichtig: die dropWhile- und takeWhile-Methoden. Wenn Sie mit der Scala-Sprache oder einer anderen funktionalen Programmiersprache vertraut sind, werden Sie diese Methoden sicherlich kennen. Sie sind sehr nützlich beim Schreiben von Code im funktionalen Stil. Lassen Sie uns hier die takeWhile-Utility-Methode diskutieren. Diese takeWhile()-Methode nimmt ein Prädikat als Argument und gibt einen Stream der Teilmenge der gegebenen Stream-Werte zurück, bis dieses Prädikat zum ersten Mal false zurückgibt. Wenn der erste Wert dieses Prädikat nicht erfüllt, gibt es einfach einen leeren Stream zurück.
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
.forEach(System.out::println);
1
2
3
4
Um mehr über die takeWhile- und dropWhile-Methoden und andere neue Methoden zu erfahren, lesen Sie bitte mein Original-Tutorial unter: Java SE 9: Stream-API-Verbesserungen
Verbesserte @Deprecated-Annotation
In Java SE 8 und früheren Versionen ist die @Deprecated-Annotation nur eine Marker-Schnittstelle ohne Methoden. Sie wird verwendet, um eine Java-API zu kennzeichnen, die eine Klasse, ein Feld, eine Methode, ein Interface, einen Konstruktor, ein Enum usw. ist. In Java SE 9 hat die Oracle Corp die @Deprecated-Annotation verbessert, um mehr Informationen über veraltete APIs bereitzustellen und auch ein Tool bereitzustellen, um die statische Verwendung veralteter APIs einer Anwendung zu analysieren. Sie haben zwei Methoden zu dieser Deprecated-Schnittstelle hinzugefügt: forRemoval und since, um diese Informationen bereitzustellen.
HTTP 2 Client
In Java SE 9 plant Oracle Corp vor, die neue HTTP 2 Client API zu veröffentlichen, um das HTTP/2-Protokoll und WebSocket-Funktionen zu unterstützen. Da die bestehende oder Legacy HTTP Client API zahlreiche Probleme aufweist (wie die Unterstützung des HTTP/1.1-Protokolls, das Fehlen von Unterstützung für das HTTP/2-Protokoll und WebSocket, die ausschließlich im Blocking-Modus funktioniert, und viele Leistungsprobleme), wird diese HttpURLConnection API durch den neuen HTTP-Client ersetzt. Es wird eine neue HTTP 2 Client API unter dem Paket „java.net.http“ eingeführt. Diese unterstützt sowohl die Protokolle HTTP/1.1 als auch HTTP/2. Sie ermöglicht den Einsatz sowohl im synchronen (Blocking-Modus) als auch im asynchronen Modus. Der asynchrone Modus wird mithilfe der WebSocket-API unterstützt. Sie können diese neue API unter https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html finden. Beispiel für den HTTP 2 Client
jshell> import java.net.http.*
jshell> import static java.net.http.HttpRequest.*
jshell> import static java.net.http.HttpResponse.*
jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html
jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d
jshell> System.out.println("Response was " + response.body(asString()))
Bitte lesen Sie mein Originaltutorial unter: Java SE 9: HTTP 2 Client, um das HTTP/2-Protokoll & WebSocket, die Vorteile der neuen API und die Nachteile der ALTEN API mit einigen nützlichen Beispielen zu verstehen.
API für mehrere Auflösungen
In Java SE 9 plant Oracle Corp, eine neue API für mehrere Auflösungen einzuführen. Eine wichtige Schnittstelle in dieser API ist MultiResolutionImage. Sie ist im Paket java.awt.image verfügbar. MultiResolutionImage umschließt eine Gruppe von Bildern mit unterschiedlichen Höhen und Breiten (also verschiedenen Auflösungen) und ermöglicht es uns, sie nach unseren Anforderungen abzufragen.
Verschiedene Java 9 Funktionen
In diesem Abschnitt werde ich einfach einige verschiedene neue Funktionen von Java SE 9 auflisten. Ich sage nicht, dass diese Funktionen weniger wichtig sind. Sie sind ebenfalls wichtig und nützlich, um sie gut zu verstehen, mit einigen nützlichen Beispielen. Bisher habe ich nicht genug Informationen über diese Funktionen erhalten. Deshalb werde ich sie hier kurz auflisten. Ich werde diese Funktionen nach und nach aufgreifen und sie mit einer kurzen Diskussion und einem Beispiel im obigen Abschnitt hinzufügen. Und schließlich später ein separates Tutorial schreiben.
- Verbesserungen am Garbage Collector (GC)
- Stack-Walking-API
- Filtern von eingehenden Serialisierungsdaten
- Veraltet die Applet-API
- Individuelle Zeichenkettenverkettung
- Verbesserte Method Handles
- Java Platform Logging-API und -Dienst
- Kompakte Zeichenketten
- Parser-API für Nashorn
- Javadoc-Suche
- HTML5 Javadoc
I will pickup these java 9 features one by one and update them with enough description and examples. That’s all about Java 9 features in brief with examples.
Source:
https://www.digitalocean.com/community/tutorials/java-9-features-with-examples