Caratteristiche di Java 9 con Esempi

Java 9 è una release importante e ha introdotto numerose funzionalità per gli sviluppatori. In questo articolo, esamineremo dettagliatamente le caratteristiche di Java 9.

Java 10 è stato rilasciato; per una panoramica completa sul rilascio di Java 10, consulta Java 10 Features.

Java 9 Features

Alcune delle importanti funzionalità di Java 9 includono;

  1. Java 9 REPL (JShell)
  2. Factory Methods per Liste, Set, Mappe e Map.Entry Immutevoli
  3. Metodi Privati nelle Interfacce
  4. Sistema Modulare Java 9
  5. Miglioramenti all’API di Processo
  6. Miglioramenti a Try With Resources
  7. Miglioramenti all’API CompletableFuture
  8. Reactive Streams
  9. Operatore Diamond per Classi Interne Anonime
  10. Miglioramenti alla Classe Optional
  11. Miglioramenti all’API di Stream
  12. Annotazione @Deprecated migliorata
  13. Client HTTP 2
  14. API immagini a risoluzione multipla
  15. Altre funzionalità di Java 9

Oracle Corporation sta per rilasciare Java SE 9 verso la fine di marzo 2017. In questo post, discuterò brevemente delle “Funzionalità di Java 9” con alcuni esempi.

REPL di Java 9 (JShell)

Oracle Corp ha introdotto un nuovo strumento chiamato “jshell”. Sta per Java Shell ed è anche conosciuto come REPL (Read Evaluate Print Loop). È utilizzato per eseguire e testare qualsiasi costrutto Java come classe, interfaccia, enum, oggetto, istruzioni, ecc. molto facilmente. Possiamo scaricare il software JDK 9 EA (Early Access) da 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

Se vuoi saperne di più sullo strumento REPL, per favore leggi Java 9 REPL Basics (Parte 1) e Java 9 REPL Features (Parte 2).

Metodi di fabbrica per Lista, Set, Mappa e Mappa.Entry immutabili

Oracle Corp ha introdotto alcuni metodi di fabbrica convenienti per creare oggetti Lista, Set, Mappa e Mappa.Entry immutabili. Questi metodi di utilità sono utilizzati per creare oggetti Collection vuoti o non vuoti. Nelle versioni Java SE 8 e precedenti, possiamo utilizzare i metodi di utilità della classe Collections come unmodifiableXXX per creare oggetti Collection immutabili. Ad esempio, se vogliamo creare una Lista Immutabile, possiamo utilizzare il metodo Collections.unmodifiableList. Tuttavia, questi metodi Collections.unmodifiableXXX sono un approccio noioso e verboso. Per superare questi limiti, Oracle Corp ha aggiunto un paio di metodi di utilità alle interfacce Lista, Set e Mappa. Le interfacce Lista e Set hanno metodi “of()” per creare oggetti Lista o Set immutabili vuoti o non vuoti come mostrato di seguito: Esempio di Lista Vuota

List immutableList = List.of();

Esempio di Lista Non Vuota

List immutableList = List.of("one","two","three");

La Mappa ha due serie di metodi: metodi of() e metodi ofEntries() per creare rispettivamente un oggetto Mappa Immutabile e un oggetto Mappa.Entry Immutabile. Esempio di Mappa Vuota

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

Esempio di Mappa Non Vuota

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}

Se vuoi leggere di più su questi metodi di utilità, per favore consulta i seguenti link:

Metodi privati nelle interfacce

In Java 8, possiamo fornire l’implementazione del metodo nelle interfacce utilizzando metodi Default e Statici. Tuttavia non possiamo creare metodi privati nelle interfacce. Per evitare codice ridondante e aumentare la riutilizzabilità, Oracle Corp sta per introdurre metodi privati nelle interfacce di Java SE 9. Da Java SE 9 in poi, possiamo scrivere anche metodi privati e metodi privati statici in un’interfaccia utilizzando la parola chiave ‘private’. Questi metodi privati sono simili ad altri metodi privati di classe, non c’è differenza tra di loro.

public interface Card{

  private Long createCardID(){
    // Implementazione del metodo va qui.
  }

  private static void displayCardDetails(){
    // Implementazione del metodo va qui.
  }

}

Se vuoi leggere di più su questa nuova funzionalità, per favore consulta questo link: Java 9 Metodi privati in Interfaccia.

Sistema dei Moduli Java 9

Una delle grandi novità o caratteristiche di Java 9 è il Sistema dei Moduli. Oracle Corp sta per introdurre le seguenti funzionalità come parte del Progetto Jigsaw.

  • JDK Modulare
  • Codice Sorgente Java Modulare
  • Immagini Runtime Modulari
  • Incapsulare API Interne di Java
  • Sistema Modulare della Piattaforma Java

Prima delle versioni di Java SE 9, utilizzavamo Jar Monolitici per sviluppare applicazioni basate su Java. Questa architettura ha molte limitazioni e svantaggi. Per evitare tutti questi difetti, Java SE 9 arriva con il Sistema dei Moduli. JDK 9 viene fornito con 92 moduli (potrebbero cambiare nella versione finale). Possiamo utilizzare i Moduli JDK e possiamo anche creare i nostri moduli come mostrato di seguito: Esempio di Modulo Semplice

module com.foo.bar { }

Qui stiamo utilizzando ‘module’ per creare un modulo semplice. Ogni modulo ha un nome, codice correlato e altre risorse. Per leggere ulteriori dettagli su questa nuova architettura e per esperienza pratica, per favore consulta i miei tutorial originali qui:

Miglioramenti all’API di processo

Java SE 9 viene fornito con alcuni miglioramenti nell’API di processo. Sono stati aggiunti un paio di nuove classi e metodi per facilitare il controllo e la gestione dei processi del sistema operativo. Due nuove interfacce nell’API di processo:

Esempio di API di processo

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());

Miglioramento di Try-With-Resources

Sappiamo che Java SE 7 ha introdotto una nuova costruzione di gestione delle eccezioni: Try-With-Resources per gestire automaticamente le risorse. L’obiettivo principale di questa nuova istruzione è “Gestione automatica migliorata delle risorse”. Java SE 9 apporterà alcuni miglioramenti a questa istruzione per evitare ulteriore verbosità e migliorare la leggibilità. Esempio in 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());
 }
}

Esempio in Java 9

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

Per saperne di più su questa nuova funzionalità, consulta il mio tutorial originale su: Java 9 Miglioramenti Try-With-Resources

Miglioramenti all’API CompletableFuture

In Java SE 9, Oracle Corp sta per migliorare l’API CompletableFuture per risolvere alcuni problemi sollevati in Java SE 8. Aggiungeranno il supporto a alcuni ritardi e timeout, alcuni metodi di utilità e una migliore sottoclasse.

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

Qui delayedExecutor() è un metodo di utilità statico utilizzato per restituire un nuovo Executor che invia un compito all’esecutore predefinito dopo il ritardo specificato.

Flussi reattivi

Al giorno d’oggi, la programmazione reattiva è diventata molto popolare nello sviluppo di applicazioni per ottenere alcuni bei vantaggi. Framework come Scala, Play, Akka, ecc. hanno già integrato i flussi reattivi e stanno ottenendo molti benefici. Oracle Corps sta anche introducendo una nuova API di flussi reattivi in Java SE 9. L’API di flussi reattivi di Java SE 9 è un framework di pubblicazione/sottoscrizione per implementare applicazioni asincrone, scalabili e parallele molto facilmente utilizzando il linguaggio Java. Java SE 9 ha introdotto le seguenti API per sviluppare flussi reattivi nelle applicazioni basate su Java.

  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.Subscriber
  • java.util.concurrent.Flow.Processor

Leggi di più su Java 9 Reactive Streams.

Operatore Diamond per Classe Interna Anonima

Sappiamo che Java SE 7 ha introdotto una nuova funzionalità: l’operatore Diamond per evitare codice ridondante e verbosity, per migliorare la leggibilità. Tuttavia, in Java SE 8, Oracle Corp (Sviluppatore della libreria Java) ha riscontrato alcune limitazioni nell’uso dell’operatore Diamond con Classi Interne Anonime. Hanno risolto questi problemi e stanno per rilasciarli come parte di Java 9.

  public List getEmployee(String empid){
     // Codice per ottenere i dettagli dell'impiegato dal Data Store
     return new List(emp){ };
  }

Qui stiamo usando solo “List” senza specificare il parametro di tipo.

Miglioramenti alla Classe Optional

Nel Java SE 9, Oracle Corp ha aggiunto alcuni utili nuovi metodi alla classe java.util.Optional. Qui discuterò di uno di quei metodi con un semplice esempio: il metodo stream. Se un valore è presente nell’oggetto Optional dato, questo metodo stream() restituisce uno Stream sequenziale con quel valore. In caso contrario, restituisce uno Stream vuoto. Hanno aggiunto il metodo “stream()” per lavorare sugli oggetti Optional in modo pigro come mostrato di seguito:

Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

Qui il metodo Optional.stream() è utilizzato per convertire uno Stream di Optional di oggetti Employee in uno Stream di Employee in modo che possiamo lavorare su questo risultato in modo pigro nel codice risultante. Per comprendere meglio questa funzionalità con più esempi e per leggere più nuovi metodi aggiunti alla classe Optional, si prega di consultare il mio tutorial originale su: Java SE 9: Miglioramenti della classe Optional

Miglioramenti dell’API Stream

In Java SE 9, Oracle Corp ha aggiunto quattro utili nuovi metodi all’interfaccia java.util.Stream. Poiché Stream è un’interfaccia, tutti quei nuovi metodi implementati sono metodi di default. Due di essi sono molto importanti: i metodi dropWhile e takeWhile. Se sei familiare con il linguaggio Scala o qualsiasi linguaggio di programmazione funzionale, sicuramente conoscerai questi metodi. Sono metodi molto utili per scrivere del codice in stile funzionale. Discutiamo qui del metodo di utilità takeWhile. Questo metodo takeWhile() prende un predicato come argomento e restituisce uno Stream del sottoinsieme dei valori dati fino a quando quel predicato non ritorna false per la prima volta. Se il primo valore NON soddisfa quel predicato, restituisce semplicemente uno Stream vuoto.

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

Per leggere di più sui metodi takeWhile e dropWhile e sugli altri nuovi metodi, consulta il mio tutorial originale su: Java SE 9: Miglioramenti all’API Stream

Enhanced annotazione @Deprecated

In Java SE 8 e nelle versioni precedenti, l’annotazione @Deprecated è solo un’interfaccia di marcatura senza metodi. Viene utilizzata per contrassegnare un’API Java che può essere una classe, un campo, un metodo, un’interfaccia, un costruttore, un’enumerazione, ecc. In Java SE 9, Oracle Corp ha potenziato l’annotazione @Deprecated per fornire ulteriori informazioni sull’API deprecata e ha introdotto un Tool per analizzare l’uso statico delle API deprecate in un’applicazione. Sono stati aggiunti due metodi a questa interfaccia Deprecated: forRemoval e since per fornire queste informazioni.

HTTP 2 Client

In Java SE 9, Oracle Corp sta per rilasciare la nuova API del cliente HTTP 2 per supportare il protocollo HTTP/2 e le funzionalità WebSocket. Poiché l’API del cliente HTTP esistente o Legacy presenta numerose problematiche (come il supporto al protocollo HTTP/1.1 e l’assenza di supporto ai protocolli HTTP/2 e WebSocket, funziona solo in modalità bloccante e presenta molte problematiche di prestazioni), stanno sostituendo questa API HttpURLConnection con il nuovo client HTTP. Introdurranno una nuova API del cliente HTTP 2 sotto il pacchetto “java.net.http”. Supporta sia i protocolli HTTP/1.1 che HTTP/2. Supporta le modalità sia sincrone (modalità bloccante) che asincrone. Supporta la modalità asincrona utilizzando l’API WebSocket. È possibile visualizzare questa nuova API su https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html Esempio del cliente HTTP 2

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()))

Per favore, consulta il mio tutorial originale su: Java SE 9: Cliente HTTP 2 per comprendere il protocollo HTTP/2 e WebSocket, i vantaggi della nuova API e gli svantaggi della VECCHIA API con alcuni esempi utili.

API Immagine a Risoluzione Multipla

In Java SE 9, Oracle Corp sta per introdurre una nuova API di Immagine a Risoluzione Multipla. L’interfaccia principale in questa API è MultiResolutionImage. È disponibile nel pacchetto java.awt.image. MultiResolutionImage incapsula un insieme di immagini con diverse altezze e larghezze (cioè risoluzioni diverse) e ci consente di interrogarle in base alle nostre esigenze.

Caratteristiche Varie di Java 9

In questa sezione, elencherò alcune delle nuove caratteristiche varie di Java SE 9. NON sto dicendo che queste siano caratteristiche meno importanti. Sono anch’esse importanti e utili per comprenderle bene, fornendo alcuni esempi pratici. Al momento, non ho abbastanza informazioni su queste caratteristiche. Ecco perché le elencherò qui per una comprensione breve. Prenderò ognuna di queste caratteristiche singolarmente e le aggiungerò alla sezione precedente con una breve discussione ed esempio. Inoltre, scriverò un tutorial separato in seguito.

  • Miglioramenti al Garbage Collector (GC)
  • API di Stack-Walking
  • Filtrare i Dati di Serializzazione in Entrata
  • Deprecazione dell’API di Applet
  • Concatenazione di Stringhe Indificata
  • Maniglie di Metodo Potenziate
  • API e Servizio di Logging della Piattaforma Java
  • Stringhe Compatte
  • API del Parser per Nashorn
  • Ricerca di Javadoc
  • Javadoc HTML5

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