Java 9 is een belangrijke release en het heeft ons veel functies voor ontwikkelaars gebracht. In dit artikel zullen we de functies van Java 9 in detail bekijken.
Java 10 is uitgebracht, voor een volledig overzicht van de Java 10-release, ga naar Java 10-functies.
Java 9-functies
Enkele van de belangrijke Java 9-functies zijn;
- Java 9 REPL (JShell)
- Factory-methoden voor onveranderlijke lijst, set, map en map.entry
- Privémethoden in interfaces
- Java 9-module systeem
- Proces-API-verbeteringen
- Probeer met middelenverbetering
- CompletableFuture API-verbeteringen
- Reactive streams
- Diamantoperator voor anonieme binnenklasse
- Optioneel klasseverbeteringen
- Stream API-verbeteringen
- Verbeterde @Achterhaalde annotatie
- HTTP 2-client
- API voor multi-resolutie afbeeldingen
- Diverse Java 9-functies
Oracle Corporation gaat Java SE 9 naar verwachting rond eind maart 2017 uitbrengen. In dit bericht zal ik “Java 9-functies” kort bespreken met enkele voorbeelden.
Java 9 REPL (JShell)
Oracle Corp heeft een nieuw gereedschap geïntroduceerd genaamd “jshell”. Het staat voor Java Shell en staat ook bekend als REPL (Read Evaluate Print Loop). Het wordt gebruikt om eenvoudig Java-constructies zoals klasse, interface, enum, object, statements, enz. uit te voeren en te testen. We kunnen JDK 9 EA (Early Access)-software downloaden vanaf 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
Als je meer wilt weten over het REPL-gereedschap, bekijk dan Java 9 REPL Basics (Deel 1) en Java 9 REPL-functies (Deel 2).
Factory-methoden voor Immutable-lijst, Set, Map en Map.Entry
Oracle Corp heeft enkele handige factory-methoden geïntroduceerd om Immutable-lijst, Set, Map en Map.Entry-objecten te maken. Deze hulpprogramma-methoden worden gebruikt om lege of niet-lege Collection-objecten te maken. In Java SE 8 en eerdere versies kunnen we gebruikmaken van hulpprogramma-methoden van de Collections-klasse zoals unmodifiableXXX
om Immutable Collection-objecten te maken. Als we bijvoorbeeld een Immutable-lijst willen maken, kunnen we de Collections.unmodifiableList
-methode gebruiken. Deze Collections.unmodifiableXXX
-methoden zijn echter een tijdrovende en omslachtige aanpak. Om deze tekortkomingen te overwinnen, heeft Oracle Corp een paar hulpprogramma-methoden toegevoegd aan de List-, Set- en Map-interfaces. List- en Set-interfaces hebben “of()” methoden om een leeg of niet-leeg Immutable-lijst- of Set-object te maken, zoals hieronder getoond: Voorbeeld van lege lijst
List immutableList = List.of();
Voorbeeld van niet-lege lijst
List immutableList = List.of("one","two","three");
De Map heeft twee sets methoden: of()
-methoden en ofEntries()
-methoden om respectievelijk een Immutable Map-object en een Immutable Map.Entry-object te maken. Voorbeeld van lege map
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
Voorbeeld van niet-lege map
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
Als je meer wilt lezen over deze hulpprogramma-methoden, bekijk dan de volgende links:
- Java 9 Fabrieksmethoden voor Onveranderlijke Lijst
- Java 9 Fabrieksmethoden voor Onveranderlijke Set
- Java 9 Fabrieksmethoden voor Onveranderlijke Map en Map.Entry
Private methoden in Interfaces
In Java 8 kunnen we methoden implementeren in Interfaces met behulp van Standaard- en Statische methoden. We kunnen echter geen private methoden aanmaken in Interfaces. Om redundante code te vermijden en meer herbruikbaarheid te bieden, gaat Oracle Corp private methoden introduceren in Java SE 9 Interfaces. Vanaf Java SE 9 kunnen we ook private en private statische methoden schrijven in een interface met behulp van het ‘private’ trefwoord. Deze private methoden zijn net als andere private methoden van een klasse, er is geen verschil tussen hen.
public interface Card{
private Long createCardID(){
// Methode-implementatie komt hier.
}
private static void displayCardDetails(){
// Methode-implementatie komt hier.
}
}
Als je meer wilt lezen over deze nieuwe functie, ga dan naar deze link: Java 9 Private methoden in Interface.
Java 9 Module System
Een van de grote veranderingen of functies in Java 9 is het Module System. Oracle Corp gaat de volgende functies introduceren als onderdeel van het Jigsaw Project.
- Modular JDK
- Modulaire Java-broncode
- Modulaire uitvoeringsimages
- Java interne API’s inkapselen
- Java Platform Module System
Voor Java SE 9-versies gebruikten we Monolithische Jars om Java-gebaseerde toepassingen te ontwikkelen. Deze architectuur heeft veel beperkingen en nadelen. Om al deze tekortkomingen te vermijden, komt Java SE 9 met het Module System. JDK 9 wordt geleverd met 92 modules (kan veranderen in de definitieve release). We kunnen JDK-modules gebruiken en ook onze eigen modules maken, zoals hieronder wordt getoond: Eenvoudig modulevoorbeeld
module com.foo.bar { }
Hier gebruiken we ‘module’ om een eenvoudige module te maken. Elke module heeft een naam, bijbehorende code en andere resources. Voor meer details over deze nieuwe architectuur en praktische ervaring, kunt u mijn originele tutorials hier lezen:
- Java 9 Module System Basics
- Voorbeelden van Java 9-modules met de opdrachtprompt
- Java 9 Hello World Module Voorbeeld met behulp van Eclipse IDE
Process API Verbeteringen
Java SE 9 wordt geleverd met enkele verbeteringen in de Process API. Ze hebben een paar nieuwe klassen en methoden toegevoegd om het beheer en de controle van OS-processen te vergemakkelijken. Twee nieuwe interfaces in de Process API:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
Process API voorbeeld
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
Try-With Resources Verbetering
We weten dat Java SE 7 een nieuwe uitzonderingsafhandelingsconstructie heeft geïntroduceerd: Try-With-Resources om resources automatisch te beheren. Het hoofddoel van deze nieuwe instructie is “Automatisch Beter Resourcebeheer”. Java SE 9 zal enkele verbeteringen aan deze instructie bieden om wat meer omslachtigheid te vermijden en de leesbaarheid te verbeteren. Java SE 7 voorbeeld
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}
Java 9 voorbeeld
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
Om meer te lezen over deze nieuwe functie, ga alstublieft door mijn originele tutorial op: Java 9 Try-With-Resources Verbeteringen
CompletableFuture API Verbeteringen
In Java SE 9 gaat Oracle Corp CompletableFuture API verbeteren om enkele problemen op te lossen die zijn ontstaan in Java SE 8. Ze gaan ondersteuning toevoegen voor enkele vertragingen en time-outs, enkele hulpprogramma-methoden en betere subklassen.
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
Hier is delayedExecutor() een statische hulpprogrammamethode die wordt gebruikt om een nieuwe Executor te retourneren die een taak indient bij de standaardexecutor na de opgegeven vertraging.
Reactive Streams
Tegenwoordig is Reactieve Programmering erg populair geworden bij het ontwikkelen van toepassingen om enkele mooie voordelen te krijgen. Scala, Play, Akka, etc. Frameworks hebben al Reactieve Streams geïntegreerd en krijgen veel voordelen. Oracle Corps introduceert ook een nieuwe Reactive Streams API in Java SE 9. Java SE 9 Reactive Streams API is een Publish/Subscribe Framework om Asynchrone, Schaalbare en Parallelle toepassingen zeer eenvoudig te implementeren met behulp van de Java-taal. Java SE 9 heeft de volgende API geïntroduceerd om Reactive Streams te ontwikkelen in op Java gebaseerde toepassingen.
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
Lees meer op Java 9 Reactive Streams.
Diamantoperator voor anonieme binnenklasse
We weten dat Java SE 7 een nieuwe functie heeft geïntroduceerd: de Diamantoperator om overbodige code en omslachtigheid te vermijden, om de leesbaarheid te verbeteren. Echter, in Java SE 8 heeft Oracle Corp (Java Library Developer) vastgesteld dat er enkele beperkingen zijn bij het gebruik van de Diamantoperator met anonieme binnenklasse. Ze hebben die problemen opgelost en zijn van plan ze uit te brengen als onderdeel van Java 9.
public List getEmployee(String empid){
// Code om werknemersgegevens op te halen uit de gegevensopslag
return new List(emp){ };
}
Hier gebruiken we gewoon “List” zonder het typeparameter te specificeren.
Verbeteringen aan de Optionele Klasse
In Java SE 9 heeft Oracle Corp enkele nuttige nieuwe methoden toegevoegd aan de java.util.Optional-klasse. Hier ga ik een van die methoden bespreken met een eenvoudig voorbeeld: de stream-methode. Als er een waarde aanwezig is in het gegeven Optioneel object, retourneert deze stream() methode een opeenvolgende Stream met die waarde. Anders retourneert het een lege Stream. Ze hebben de “stream()” methode toegevoegd om te werken aan Optionele objecten in luie modus zoals hieronder getoond:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
Hier wordt de Optional.stream() methode gebruikt om een Stream van Optionele Employee-objecten om te zetten in een Stream van Employee-objecten, zodat we hieraan in luie modus kunnen werken in de resultaatcode. Om meer te begrijpen over deze functie met meer voorbeelden en om meer nieuwe methoden toegevoegd aan de Optional-klasse te lezen, ga alstublieft naar mijn originele tutorial op: Java SE 9: Verbeteringen aan de Optionele klasse
Verbeteringen aan de Stream API
In Java SE 9 heeft Oracle Corp vier nuttige nieuwe methoden toegevoegd aan de java.util.Stream-interface. Aangezien Stream een interface is, zijn al die nieuwe geïmplementeerde methoden standaardmethoden. Twee daarvan zijn erg belangrijk: de dropWhile- en takeWhile-methoden. Als je bekend bent met de Scala-taal of een andere functionele programmeertaal, ken je deze methoden zeker. Dit zijn zeer nuttige methoden bij het schrijven van functionele code. Laten we hier de takeWhile-hulpmethode bespreken. Deze takeWhile() neemt een predicaat als argument en retourneert een Stream van de subset van de gegeven Stream-waarden totdat dat Predicaat voor de eerste keer false retourneert. Als de eerste waarde niet aan dat Predicaat voldoet, retourneert het gewoon een lege Stream.
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
Om meer te lezen over de takeWhile- en dropWhile-methoden en andere nieuwe methoden, bekijk mijn originele tutorial op: Java SE 9: Stream API Verbeteringen
Verbeterde @Acherverouderd annotatie
In Java SE 8 en eerdere versies is de @Deprecated-annotatie slechts een markeringsinterface zonder enige methoden. Het wordt gebruikt om een Java API te markeren die een klasse, veld, methode, interface, constructor, enum, enz. is. In Java SE 9 heeft Oracle Corp de @Deprecated-annotatie verbeterd om meer informatie te bieden over verouderde API’s en ook een Tool toegevoegd om het statische gebruik van verouderde API’s in een applicatie te analyseren. Ze hebben twee methoden toegevoegd aan deze Deprecated-interface: forRemoval en since om deze informatie te verstrekken.
HTTP 2 Client
In Java SE 9 gaat Oracle Corp een nieuwe HTTP 2 Client API uitbrengen om het HTTP/2-protocol en WebSocket-functies te ondersteunen. Aangezien de bestaande of Legacy HTTP Client API tal van problemen heeft (zoals het ondersteunen van het HTTP/1.1-protocol en het niet ondersteunen van het HTTP/2-protocol en WebSocket, alleen werkt in de blokkeringsmodus en veel prestatieproblemen heeft), vervangen ze deze HttpURLConnection API door een nieuwe HTTP-client. Ze gaan een nieuwe HTTP 2 Client API introduceren onder het pakket “java.net.http”. Het ondersteunt zowel HTTP/1.1- als HTTP/2-protocollen. Het ondersteunt zowel Synchrone (Blokkeringsmodus) als Asynchrone Modi. Het ondersteunt de Asynchrone Modus met behulp van de WebSocket API. We kunnen deze nieuwe API bekijken op https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html Voorbeeld van 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()))
Lees alstublieft mijn originele handleiding op: Java SE 9: HTTP 2 Client om het HTTP/2-protocol & WebSocket te begrijpen, voordelen van de nieuwe API en nadelen van de OUDE API met enkele nuttige voorbeelden.
Multi-Resolutie Afbeeldings-API
In Java SE 9 gaat Oracle Corp een nieuwe Multi-Resolution Image API introduceren. Een belangrijke interface in deze API is MultiResolutionImage. Het is beschikbaar in het pakket java.awt.image. MultiResolutionImage omvat een set afbeeldingen met verschillende hoogtes en breedtes (dat wil zeggen verschillende resoluties) en stelt ons in staat om ze te raadplegen volgens onze eisen.
In deze sectie zal ik gewoon enkele diverse Java SE 9 Nieuwe Functies opsommen. Ik zeg NIET dat deze minder belangrijke functies zijn. Ze zijn ook belangrijk en nuttig om ze goed te begrijpen met enkele nuttige voorbeelden. Op dit moment heb ik niet genoeg informatie over deze functies gekregen. Daarom ga ik ze hier opsommen voor een beknopt begrip. Ik zal deze functies één voor één oppakken en toevoegen aan de bovenstaande sectie met een beknopte bespreking en voorbeeld. En later een aparte tutorial schrijven.
- GC (Garbage Collector) Verbeteringen
- Stack-Walking API
- Filteren van binnenkomende serialisatiegegevens
- Verouderen van de Applet API
- Individuele String Concatenatie
- Verbeterde Method Handles
- Java Platform Logging API en Service
- Compacte Strings
- Parser API voor Nashorn
- Javadoc Zoeken
- 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