Novedades y nuevas características de Java 8
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
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:
- Se añaden las expresiones lambda o closures y se adapta la API para usarlas en los sitios que se pueda.
- Se definen nuevos perfiles compactos para dispositivos que no necesitan toda la API Java, esto es una alternativa a la modularización. Inicialmente la modularización era una característica que estaba planificada para Java 8 pero finalmente se ha aplazado a posteriores versiones.
- Incluido nuevo motor de Javascript Nashorn que implementa ECMAscript 5.1 y es más rápido que su predecesor Rhino.
- Eliminación de espacio de memoria Permanent Generation (PermGen) que pasa a llamarse Metaspace. Su tamaño será dinámico pero no evitará fugas de memoria.
- Soporte para la creación de una máquina virtual menor a 3 MB.
- Acceso mediante reflection a los nombres de los parámetros. Mejorará la legibilidad del código que use reflection y permitirá mejorar el soporte en los IDE.
- Ordenación en java.util.Arrays de forma paralela.
- Operaciones masivas sobre colecciones tales como filter/map/reduce (streams) de forma serializada o paralela.
- Soporte de forma estándar para la codificación y decodificación Base64.
- Nueva API para Date y Time.
- Varias mejoras de seguridad.
- Se incorporan en la máquina virtual Java HotSpot características que estaban en JRockit, convergiendo ambas máquinas virtuales. Se incorpora Mission Control.
- Mejoras en JDBC la base para el acceso en bases de datos en Java.
- Otras novedades.
Streams
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.
Lambda
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.
Referencias de métodos
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:
- A métodos estáticos
- A un método de una instancia concreta
- A un método de instancia de una instancia arbitraria de un tipo
- A un constructor
Interfaces funcionales
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:
Métodos por defecto
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.
Métodos estáticos en interfaces
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.
Anotaciones en cualquier uso de tipos
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.
Java Time
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.
Futuro Java 9
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.
Pasado en Java 5, 6 y 7
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.
Java 7
- Project coin
- Strings en switchs
- Gestión automática de recursos en sentencias try-catch
- Multicatch
- Rethrow de excepciones más precisos
- Operador diamante <>
- Literales binarios
- Guiones bajos en literales numéricos
- Fork/Join y utilidades de concurrencia
- Mejoras en trabajo con archivos y carpetas
Más en Java 7 New Features and Enhancements y Java 7 a look back
Java 6
- Lenguajes de scripting
- API para el compilador
- Nuevas anotaciones
- Nueva API para XML (StaX)
Más en Java 6 New Features and Enhancements y Introduction to java 6 newfeatures
Java 5
- Generics
- Bucle for mejorado
- Autoboxing/unboxing
- Enums
- Varargs
- Static import
- Anotaciones
Más en Java 5 New Features and Enhancements
Presentación
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
Reader Comments (7)
Muchas gracias por el post. Hacia falta uno que explicara que cambia, que ya solo con las lambdas es un cambio gordo.
Buenas, una consulta sobre esto de definir una implementación por defecto en la interface.
Supongamos que tengo 2 interfaces que definen un mismo método por default pero con implementación distinta, una clase que implemente las 2 interfaces que resultado daría?
O sea, como se resuelven los problemas de 'herencia múltiple' como en la misma nota lo llaman?
Saludos
Excelente post..
@diego En [1] lo explican, basicamente se ha de reimplementar en la clase para eliminar la ambiguedad.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public interface B {
default void foo(){
System.out.println("Calling B.foo()");
}
}
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}
[1] http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/
Hola,
creo que esto esta mal:
Collections.sort(personas, (Persona u1, Persona u2) -> {
p2.getAltura().compareTo(p2.getAltura())
});
debería ser:
Collections.sort(personas, (Persona p1, Persona p2) -> {
p2.getAltura().compareTo(p2.getAltura())
});
Por fin Joda time :'D (JSR 310)
No explican mucho solo hicieron una mala traduccion de la nota original. A ver si pueden explicar algo de verdad y no esta mentira que copian y pegan pasada por google traslator