Esta es la segunda parte del artículo Nueve Nuevas Funcionalidades de JDK 9. En este artículo revisaremos las siguientes mejoras:

  • Mejoras en el API Stream
  • Bucle Read-Eval-Print: jShell
  • Mejoras en la concurrencia

Mejoras en el API Stream

Siempre es útil poder crear un stream desde una colección de datos, y JDK 8 proporciona un conjunto de métodos para realizar esto fuera del API Collection (BufferedReader.lines(), por ejemplo). En JDK 9 se agregado algunas fuentes adicionales, como java.util.Scanner y java,útil.regex.Matcher.

JDK 9 agrega cuatro métodos para la interface Stream.

Primero, hay dos métodos relacionados: takeWhile(Predicated) y dropWhile(Predicated). Estos métodos son complementarios a limit() y skip(), pero estos utilizan un Predicated antes que un valor Integer. El método takeWhile() continua tomando los elementos del stream de entrada y los pasa al stream de salida hasta que el método test() del Predicated devuelva verdadero. El método dropWhile() realiza lo opuesto; entrega elementos desde el stream de entrada hasta que test() del Predicated de verdadero. Todos los elementos restantes son pasados al stream de salida.

El tercer método es ofNullable(T t), que retorna un stream de cero o un elemento, dependiendo de si el valor que se paso es null. Es útil para eliminar un valor null antes de construir un stream, y es similar al método stream() de la clase Optional.

El último método de stream es la nueva versión del método static iterate(). La versión en JDK 8 toma un parámetro como semilla y crea un número infinito de salida. JDK 9 agrega un método sobre cargado que toma tres parámetros, que en forma efectiva te brinda la habilidad de replicar un bucle for estándar como un stream. Por ejemplo, Stream.iterate(0, i -> i < 5, i -> i+1) proporciona un stream de enteros de 0 a 4.

Bucle Read-Eval-Print: jshell ( JEP 222)

Read - Eval - PrintJDK 9 incluye jshell, una nueva herramienta para línea de comando que permite desarrollar y ejecutar código Java en forma interactiva, diferente a los IDEs, donde el código tiene que ser editado, compilado y luego ejecutado. Los desarrolladores pueden rápidamente escribir secciones de código y el jshell en forma continua puede leer el código, evaluarlo e imprimir el resultado de los cambios que el código está generando.

A fin de tener una herramienta fácil de utilizar, está incluye funcionalidades como un historial del código, completar el código, agregar punto y coma cuando sea necesario e imports configurables y pre-definidos. Es posible también declarar variables cuyo tipo se defina después de la declaración.

Una de las principales razones para incluir REPL en el JDK es poder utilizar Java como una herramienta para enseñar a programar, sin considerar todo el código que el programador requiere antes de obtener un resultado.

Mejoras en la concurrencia (JEP 266)

Java 5 introdujo características para simplificar el escribir código para Threads concurrentes. Posteriores actualizaciones mejoraron estas características agregando el framework fork/join en JDK 7 y, recientemente, los stream paralelos en JDK 8. Ahora, JDK 9, proporciona mejoras en la concurrencia en dos áreas.

La primera es el framework publish-subscribe para reactive streams. Procesar un stream de elementos en una forma asíncrona puede generar problemas cuando la velocidad a la que se someten los elementos al código de procesamiento aumenta bruscamente.  Si el procesador no es capaz de manejar la carga, la fuente de elementos puede ser bloqueada o se puede producir  sobre carga en el buffer.

Reactive streams utiliza el modelo de publish-subscribe en donde el elemento que procesa el stream (el subscritor) se subscribe al proveedor de los elementos (el editor). Realizando esto, el proveedor conoce cuantos elementos tiene que pasar al procesador en cada momento. Si el proveedor necesita pasar más que este número, se pueden utilizar técnicas como un buffer local o utilizar un procesador alternativo.

JDK 9 incluye una nueva clase, Flow, que encierra varias interfaces: Flow.Processor, Flow.Subscriber, Flow.Publisher y Flow.Subscription. La clase Subscription es utilziada para enlazar un Publisher con un Subscriber.

La segunda funcionalidad nueva para concurrencia en JDK 9, consiste en una mejora para la clase CompletableFuture, que se agregó en JDK 8. Se han agregado varios métodos para mejorar la funcionalidad time-based. Estas mejoras permiten el uso de time-outs mediante métodos tales como completeOnTimeout(), delayedExecutor() y orTimeout().


El post se encuentra basado en Nine New Developer Features in JDK 9 de Java Magazine de Oracle.

Nueve nuevas funcionalidades en JDK 9 – Parte 2
Si te gusto, comparte ...Email this to someone
email
Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Share on Google+
Google+
Etiquetado en:                

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Facebook
A %d blogueros les gusta esto: