Características de Java 9 con Ejemplos

Java 9 es una versión importante y ha traído consigo muchas características para los desarrolladores. En este artículo, examinaremos en detalle las características de Java 9.

Java 10 ha sido lanzado, para obtener una visión completa del lanzamiento de Java 10, consulta Características de Java 10.

Características de Java 9

Algunas de las características importantes de Java 9 son;

  1. Java 9 REPL (JShell)
  2. Métodos de fábrica para Listas, Conjuntos, Mapas e Map.Entry inmutables
  3. Métodos privados en interfaces
  4. Sistema de módulos de Java 9
  5. Mejoras en la API de procesos
  6. Mejoras en Try With Resources
  7. Mejoras en la API CompletableFuture
  8. Flujos Reactivos
  9. Operador Diamond para Clases Internas Anónimas
  10. Mejoras en la Clase Optional
  11. Mejoras en la API de Streams
  12. Mejora de la anotación @Deprecated
  13. Cliente HTTP 2
  14. API de Imágenes de Multi-Resolución
  15. Características Varias de Java 9

Oracle Corporation tiene previsto lanzar Java SE 9 hacia finales de marzo de 2017. En esta publicación, voy a hablar brevemente sobre las “Características de Java 9” con algunos ejemplos.

Java 9 REPL (JShell)

Oracle Corp ha introducido una nueva herramienta llamada “jshell”. Significa Java Shell y también es conocida como REPL (Read Evaluate Print Loop). Se utiliza para ejecutar y probar cualquier construcción de Java como clase, interfaz, enumeración, objeto, declaraciones, etc. muy fácilmente. Podemos descargar el software JDK 9 EA (Early Access) desde 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

Si quieres saber más sobre la herramienta REPL, por favor, consulta Conceptos básicos de REPL de Java 9 (Parte 1) y Funciones de REPL de Java 9 (Parte 2).

Métodos de fábrica para Listas, Conjuntos, Mapas e Map.Entry Inmutables

Oracle Corp ha introducido algunos métodos de fábrica convenientes para crear objetos List, Set, Map y Map.Entry Inmutables. Estos métodos de utilidad se utilizan para crear objetos de Colección vacíos o no vacíos. En Java SE 8 y versiones anteriores, podemos usar métodos de utilidad de la clase Collections como unmodifiableXXX para crear objetos de Colección Inmutables. Por ejemplo, si queremos crear una Lista Inmutable, entonces podemos usar el método Collections.unmodifiableList. Sin embargo, estos métodos Collections.unmodifiableXXX son un enfoque tedioso y verbose. Para superar esas deficiencias, Oracle Corp ha agregado un par de métodos de utilidad a las interfaces List, Set y Map. Las interfaces List y Set tienen métodos “of()” para crear objetos de Lista o Set Inmutables vacíos o no vacíos como se muestra a continuación: Ejemplo de Lista Vacía

List immutableList = List.of();

Ejemplo de Lista No Vacía

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

El Map tiene dos conjuntos de métodos: métodos of() y métodos ofEntries() para crear un objeto Map Inmutable y un objeto Map.Entry Inmutable respectivamente. Ejemplo de Mapa Vacío

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

Ejemplo de Mapa No Vacío

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

Si desea leer más sobre estos métodos de utilidad, por favor consulte los siguientes enlaces:

Métodos privados en interfaces

En Java 8, podemos proporcionar la implementación de métodos en interfaces utilizando métodos predeterminados y estáticos. Sin embargo, no podemos crear métodos privados en interfaces. Para evitar el código redundante y aumentar la reutilización, Oracle Corp va a introducir métodos privados en las interfaces de Java SE 9. A partir de Java SE 9, podemos escribir métodos privados y métodos privados estáticos también en una interfaz utilizando la palabra clave ‘private’. Estos métodos privados son como otros métodos privados de clase, no hay diferencia entre ellos.

public interface Card{

  private Long createCardID(){
    // La implementación del método va aquí.
  }

  private static void displayCardDetails(){
    // La implementación del método va aquí.
  }

}

Si desea leer más sobre esta nueva característica, por favor, visite este enlace: Métodos privados de Java 9 en la interfaz.

Sistema de Módulos Java 9

Uno de los grandes cambios o características de Java 9 es el Sistema de Módulos. Oracle Corp va a introducir las siguientes características como parte del Proyecto Jigsaw.

  • JDK Modular
  • Código Fuente de Java Modular
  • Imágenes de Ejecución Modular
  • Encapsulación de APIs Internas de Java
  • Sistema de Módulos de Plataforma Java

Antes de las versiones de Java SE 9, estábamos utilizando Jars Monolíticos para desarrollar aplicaciones basadas en Java. Esta arquitectura tiene muchas limitaciones y desventajas. Para evitar todas estas deficiencias, Java SE 9 viene con el Sistema de Módulos. JDK 9 viene con 92 módulos (puede cambiar en la versión final). Podemos utilizar los Módulos de JDK y también podemos crear nuestros propios módulos como se muestra a continuación: Ejemplo de Módulo Simple

module com.foo.bar { }

Aquí estamos utilizando ‘module’ para crear un módulo simple. Cada módulo tiene un nombre, código relacionado y otros recursos. Para obtener más detalles sobre esta nueva arquitectura y experiencia práctica, por favor, consulta mis tutoriales originales aquí:

Mejoras en la API de Procesos

Java SE 9 viene con algunas mejoras en la API de Procesos. Se han agregado un par de clases y métodos nuevos para facilitar el control y la gestión de los procesos del sistema operativo. Dos nuevas interfaces en la API de Procesos:

Ejemplo de API de Procesos

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

Mejora en el Uso de Recursos

Sabemos que Java SE 7 ha introducido un nuevo constructo de manejo de excepciones: Try-With-Resources para administrar recursos automáticamente. El principal objetivo de esta nueva declaración es “Mejor Gestión Automática de Recursos”. Java SE 9 va a proporcionar algunas mejoras a esta declaración para evitar un poco más de verbosidad y mejorar la legibilidad. Ejemplo de 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());
 }
}

Ejemplo de Java 9

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

Para leer más sobre esta nueva característica, por favor revisa mi tutorial original en: Mejoras en Java 9 Try-With-Resources

Mejoras en la API CompletableFuture

En Java SE 9, Oracle Corp va a mejorar la API CompletableFuture para resolver algunos problemas surgidos en Java SE 8. Van a añadir soporte para algunos retrasos y tiempos de espera, algunos métodos de utilidad y una mejor subclasificación.

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

Aquí delayedExecutor() es un método de utilidad estático utilizado para devolver un nuevo Executor que envía una tarea al executor predeterminado después del retraso dado.

Streams Reactivos

Hoy en día, la Programación Reactiva se ha vuelto muy popular en el desarrollo de aplicaciones para obtener algunos beneficios hermosos. Scala, Play, Akka, etc. Los marcos ya han integrado Streams Reactivos y están obteniendo muchos beneficios. Oracle Corps también está introduciendo una nueva API de Streams Reactivos en Java SE 9. La API de Streams Reactivos de Java SE 9 es un Marco de Publicación/Suscripción para implementar aplicaciones Asincrónicas, Escalables y Paralelas muy fácilmente utilizando el lenguaje Java. Java SE 9 ha introducido la siguiente API para desarrollar Streams Reactivos en aplicaciones basadas en Java.

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

Leer más en Java 9 Reactive Streams.

Operador Diamante para Clase Interna Anónima

Sabemos que Java SE 7 introdujo una nueva característica: el Operador Diamante para evitar código redundante y verbosidad, mejorando la legibilidad. Sin embargo, en Java SE 8, Oracle Corp (Desarrollador de la Biblioteca Java) encontró algunas limitaciones en el uso del operador Diamante con Clases Internas Anónimas. Han corregido esos problemas y planean lanzarlos como parte de Java 9.

  public List getEmployee(String empid){
     // Código para obtener detalles del empleado desde el Almacén de Datos
     return new List(emp){ };
  }

Aquí estamos utilizando simplemente “List” sin especificar el parámetro de tipo.

Mejoras en la Clase Optional

En Java SE 9, Oracle Corp ha añadido algunos métodos nuevos útiles a la clase java.util.Optional. Aquí voy a hablar sobre uno de esos métodos con un ejemplo sencillo: el método stream. Si hay un valor presente en el objeto Optional dado, este método stream() devuelve un Stream secuencial con ese valor. De lo contrario, devuelve un Stream vacío. Han añadido el método “stream()” para trabajar de forma perezosa en objetos Optional, como se muestra a continuación:

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

Aquí se utiliza el método Optional.stream() para convertir un Stream de Optional de objetos Employee en un Stream de Employee, de modo que podamos trabajar en este resultado de forma perezosa en el código resultante. Para entender más sobre esta característica con más ejemplos y para leer más sobre los nuevos métodos añadidos a la clase Optional, por favor, consulta mi tutorial original en: Java SE 9: Mejoras en la Clase Optional

Mejoras en la API de Stream

En Java SE 9, Oracle Corp ha añadido cuatro nuevos métodos útiles a la interfaz java.util.Stream. Dado que Stream es una interfaz, todos esos nuevos métodos implementados son métodos por defecto. Dos de ellos son muy importantes: los métodos dropWhile y takeWhile. Si estás familiarizado con el lenguaje Scala o cualquier lenguaje de programación funcional, seguramente conocerás estos métodos. Son muy útiles al escribir código en un estilo funcional. Vamos a discutir aquí el método de utilidad takeWhile. Este takeWhile() toma un predicado como argumento y devuelve un Stream del subconjunto de los valores dados en el Stream hasta que ese predicado devuelva falso por primera vez. Si el primer valor no satisface ese predicado, simplemente devuelve un Stream vacío.

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

Para obtener más información sobre los métodos takeWhile y dropWhile, así como otros métodos nuevos, por favor consulta mi tutorial original en: Java SE 9: Mejoras en la API de Streams

Mejora @Deprecated anotación

En Java SE 8 y versiones anteriores, la anotación @Deprecated es simplemente una interfaz de marcador sin ningún método. Se utiliza para marcar una API de Java que es una clase, campo, método, interfaz, constructor, enumeración, etc. En Java SE 9, Oracle Corp ha mejorado la anotación @Deprecated para proporcionar más información sobre la API obsoleta y también proporcionar una Herramienta para analizar el uso estático de APIs obsoletas de una aplicación. Han añadido dos métodos a esta interfaz Deprecated: forRemoval y since para proporcionar esta información.

Cliente HTTP 2

En Java SE 9, Oracle Corp tiene previsto lanzar la nueva API de cliente HTTP 2 para admitir el protocolo HTTP/2 y las funciones de WebSocket. Dado que la API de cliente HTTP existente o heredada tiene numerosos problemas (como el soporte del protocolo HTTP/1.1 y la falta de soporte para HTTP/2 y WebSocket, solo funciona en modo bloqueante y presenta muchos problemas de rendimiento), están reemplazando la API HttpURLConnection con el nuevo cliente HTTP. Van a introducir una nueva API de cliente HTTP 2 bajo el paquete “java.net.http”. Esta API admite tanto los protocolos HTTP/1.1 como HTTP/2. Soporta modos síncronos (modo bloqueante) y asíncronos. Además, admite el modo asíncrono mediante la API WebSocket. Puedes consultar esta nueva API en https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html. Además, hay un ejemplo de 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()))

. Te invito a revisar mi tutorial original en: Java SE 9: Cliente HTTP 2 para comprender el protocolo HTTP/2 y WebSocket, los beneficios de la nueva API y las desventajas de la ANTIGUA API con algunos ejemplos útiles.

API de Imágenes de Resolución Múltiple

En Java SE 9, Oracle Corp tiene previsto introducir una nueva API de Imágenes de Resolución Múltiple. La interfaz importante en esta API es MultiResolutionImage. Está disponible en el paquete java.awt.image. MultiResolutionImage encapsula un conjunto de imágenes con diferentes alturas y anchos (es decir, diferentes resoluciones) y nos permite consultarlas según nuestras necesidades.

Características Varias de Java 9

En esta sección, simplemente enumeraré algunas características nuevas de Java SE 9. NO estoy diciendo que estas características sean menos importantes. También son importantes y útiles para entenderlas muy bien con algunos ejemplos útiles. Por ahora, no tengo suficiente información sobre estas características. Por eso las voy a listar aquí para una comprensión breve. Luego elegiré estas características una por una y las agregaré a la sección anterior con una breve discusión y ejemplo. Y finalmente escribiré un tutorial separado más tarde.

  • Mejoras en el GC (Recolector de Basura)
  • API de Recorrido de Pila
  • Filtrar Datos de Serialización Entrantes
  • Desaprobar la API de Applet
  • Concatenación de Cadenas Indificada
  • Manejo de Métodos Mejorado
  • API y Servicio de Registro de Plataforma Java
  • Cadenas Compactas
  • API de Analizador para Nashorn
  • Búsqueda de 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