Con la publicación de Java 8 el pasado 18 de marzo de 2014 he escrito una entrada en mi blog Blog Bitix en la que he tradado de recopilar las novedades más relevantes y destacables de esta nueva versión, un repaso a las novedades pasadas de Java 5, 6, y 7 y el posible futuro de Java 9. Reproduzco casi integramente la entrada de mi blog a continuación.
Java 8 incorporará varias novedades siguiendo la tendencia de otros lenguajes como la incorporación de lambdas o closures o una demandada nueva API para el manejo de fechas entre otras muchas características más. La lista completa de novedades es bastante amplia, a continuación pondré lo que me ha parecido más destacable:
Los streams no son un nuevo tipo de colección son una nueva forma de recorrer las colecciones distinta a los Iterator. La ventaja de los streams es que pueden procesarse de forma serializada o paralela y proporcionan un estilo de operaciones más funcionales. Un flujo consiste un una fuente (una colección), varias operaciones intermedias (de filtrado o transformación) y una operación final que produce un resultado (suma, cuenta...). Los streams son lazy de modo que las operaciones solo se realizan cuando se llama a la operación final, también son eficientes no necesitando en algunos casos procesar todos los elementos del stream para devolver el resultado final.
Tradicionalmente en la API de colecciones la iteración sobre los elementos debíamos proporcionarla de forma externa. Con Java 8 podemos expresarla de la siguiente forma.
Esta es una de las principales novedades y que más se estaba echando de menos en Java de otros lenguajes como Groovy o Python. Las expresiones lambda son funciones que no está asociadas a un determinado nombre y que pueden pasarse como argumento a otras funciones. Tienen el siguiente aspecto:
El uso de expresiones lambdas junto con el stream API proporciona a Java 8 características de programación funcional, pero sobre todo hace el código más sencillo, menos extenso, más expresivo y más legible. En las expresiones lambda de Java podemos seguir aprovechándonos de la compilación estática y del tipado fuerte.
Todo el código desarrollado previamente a Java 8 no hace uso de las lambdas, pero con las referencias a métodos podemos usar esos métodos ya implementados como si se tratasen de funciones lambdas. Hay diferentes formas de hacer referencias a métodos:
Una interfaz funcional es aquella que solo tiene un método abstracto (sin implementación). Algunos ejemplos de interfaces funcionales son Runnable, ActionListener, Comparator y Callable. Para definir una interfaz funcional se puede usar la anotación @FunctionalInterface y pueden representarse con una expresión lambda. En el siguiente ejemplo puede apreciarse que con las interfaces funcionales y las lambdas podemos hacer lo mismo de forma más clara, menos verbosa y con código más legible.
En Java 8 podemos hacer:
Hasta ahora las interfaces en Java solo podían definir métodos pero no sus implementaciones. El problema con las interfaces es que cuando se modifican se rompen todas las clases que las usan. Esto se ha resuelto de tal forma que se puedan añadir nuevos métodos con implementación a las interfaces y ha sido necesario para incorporar las lambdas a interfaces existentes como List. En Java 8 las interfaces podrán incorporar implementaciones para algunos de sus métodos, teniendo así algo parecido a herencia múltiple.
Además de definir métodos por defecto en las interfaces a partir de ahora podemos definir métodos estáticos. Definiendo métodos estáticos en las interfaces evitaremos tener que crear clases de utilidad. Podremos incluir en un mismo tipo (la interfaz) todos los métodos relacionados.
Con la introducción de anotaciones en Java 5 podemos usar anotaciones en la declaración de los tipos (definición de clases, interfaces, propiedades, métodos, ...). Desde ahora podremos usar las anotaciones en el uso de cualquier tipo como por ejemplo expresiones new, casts, cláusulas implements y cláusulas throws.
Trabajar con fechas, horas y diferentes zonas horarias en Java tradicionalmente ha sido molesto, para tratar de mejorar la situación podíamos usar la librería JodaTime. Finalmente, después de mucho tiempo esperando a que se hiciera se va a proporcionar una mejor API en el JDK 8 para trabajar con fechas, horas y zonas horarias.
Viendo el pasado reciente de Java hablar del futuro puede ser precipitado, quizá la característica más comentada sea la modularización con el proyecto conocido como Jigsaw, pero ha sido abandonada para Java 8 según tengo entendido por ser difícil incorporarla manteniendo la compatibilidad hacia atrás, por el momento dispondremos de una solución intermedia con los compact profiles.
Otro de los puntos donde parece que se pondrá énfasis es en el soporte para entornos en la nube que son en estos momentos la tendencia hacia la que evolucionan las aplicaciones.
Las versiones de Java 5, 6 y 7 también incluyeron varias novedades y dado que en el ámbito empresarial la tecnología se adopta de forma lenta es posible que mucha gente (incluido yo mismo) aún desconozca cuales eran algunas de las principales novedades y características de versiones anteriores.
Más en Java 7 New Features and Enhancements y Java 7 a look back
Más en Java 6 New Features and Enhancements y Introduction to java 6 newfeatures
Más en Java 5 New Features and Enhancements
Finalmente, una presentación muy interesante en forma de vídeo de Youtube en español y la presentación de la que se habla en formato pdf que fue publicada en JavaHispano, en él se habla de muchas de las novedades y de algunas futuras en Java 9.
En los tutoriales de Java hay algunos de estos puntos más ampliados y algunos apartados no comentados en esta entrada. Otro artículo muy completo es Everything about Java 8, en el apartado de referencia al final de la entrada hay algún enlace más digno de lectura.
¿Crees que esta nueva vesión ha sido un paso adelante para la plataforma Java? ¿debería haber incorporado alguna cosa que echas en falta? ¿cuanto tiempo será necesario para que sea usada en un entorno empresarial?
Referencia:
JDK 8
Java 8
Introduction to Java lambdas
Java 8 revealed, lambdas, default methods and bulk data operations
Lambdas coming to a Java 8 near you
Java 8 default methods
Novedades relevantes Java 8
The optional type API
Everything about Java 8
8 new features for java 8
Happy 8th birthday Java
Compiling lambda expressions scala vs Java 8
Java 8 PermGen to metaspace