Con Java 8 se han añadido diferentes funcionalidades, vemos algunas de ellas a continuación:
1) Métodos default en interfaces.
Si hasta ahora en una interfaz solo podíamos tener constantes y métodos abstractos (cabecera de método), ahora tendremos la posibilidad de declarar métodos con un comportamiento por defecto en una interfaz.Antes de Java 8 podíamos definir que toda clase que implementa a una interfaz debe construir, declarar, dar cuerpo a los distintos métodos que contenga la interfaz. En cambio, en Java 8, toda clase que implemente una interfaz debe declarar los distintos métodos que contenga la interfaz salvo aquellos que estén definidos como métodos por defecto. Estos métodos se caracterizan porque son métodos que están declarados en la propia interfaz y pueden ser utilizados directamente en la clase si nos interesa su comportamiento por defecto. Esta nueva funcionalidad queda detallada con un ejemplo al final de este artículo.
2) java.util.function:
Nueva API en Java 1.8 que se conoce como el paquete que contiene interfaces funcionales, es decir, interfaces que declaran funciones de uso común. Las interfaces en este paquete son anotadas como@FunctionalInterface. Por otro lado cabe destacar que dicha anotación, @FunctionalInterface, podemos utilizarla en una interfaz que queramos declararla como funcional. Estas interfaces funcionales se caracterizan porque pueden ser instanciadas por lambdas.
3) Lambda:
En Java 8 se añaden lambdas con la idea de añadir funciones dentro del lenguaje. Vemos un ejemplo de cómo podremos utilizar lambdas en Java 8: Definimos una interfaz ICalculadoraLamba que describe una operación general entre dos números:
@FunctionalInterface
public interface ICalculadoraLambda {
public int operacion (int x,int y);
}
¿Cómo podemos hacer que esta operación sirva para realizar una suma y producto en un mismo programa principal Java? Se consigue declarando en una variable cuál es el comportamiento de este método haciendo uso de lambdas. Lo vemos a continución:
ICalculadoraLambda iSuma = (x,y) -> x + y;
System.out.println(iSuma.operacion(4, 5));
ICalculadoraLambda iMultiplicacion= (x,y) -> x * y;
System.out.println(iMultiplicacion.operacion(4, 5));
Por consola se muestra: 9 y seguidamente 20. Esto solo es una pequeña muestra de todo lo que dará que hablar las Lambdas en Java 8.
4) java.util.Stream:
Biblioteca de clases que nos permitirá realizar distintas operaciones funcionales sobre streams. ¿Cuándo va a ser útil utilizar un objeto de este tipo? Lo vemos con un ejemplo: Obtener cuántas veces aparece el número 5 en una lista de números:
5) java.time:
Nueva API para tratar fechas, tiempos, instantes y duraciones. Nos familiarizaremos con clases como: –LocalTime: permite almacenar una hora sin fecha tal como: 12:30:16 – LocalDate: la utilizaremos para almacenar fecha sin hora, tal como 2010-03-01 – LocalDateTime: permite almacenar una fecha con hora.
6) Nuevas Excepciones:
En Java 8 disponemos de nuevas excepciones que podrán ser utilizadas tales como: UncheckedIOException.
7) Nuevos métodos en clases de uso común.
Algunos de estos métodos son:
- En la clase String el método estático join que nos permite unir distintas cadenas de caracteres en una.
public static String join(CharSequence delimiter, CharSequence... elements)
- En la clase Integer nos encontramos con nuevos métodos estáticos que nos permiten:
- Dividir y comparar números sin tener en cuenta su signo:
public static int divideUnsigned(int dividend, int divisor)
public static int compareUnsigned(int x, int y)
. Las operaciones de suma, resta, obtener el máximo y el mínimo entre dos números:
public static int sum(int a, int b)
public static int max(int a, int b)
Como dijimos anteriormente, pasamos a detallar una de las novedades que nos trae Java 8: – Métodos default en Interfaces. Añadir métodos con cuerpo en las interfaces: Hasta ahora, las interfaces solo podían contener cabecera de métodos abstractos y constantes. Ejemplo:
Una clase que implementa dicha interfaz debe contener como mínimo la implementación de los métodos que han sido declarados en la interfaz. Todo tipo de calculadora que implemente ICalculadora podrá realizar todas las operaciones que se indiquen en esta última.
Por tanto, si en la interfaz se añade posteriormente un método abstracto, en la clase Java que implementa a dicha interfaz encontraríamos un error de compilación «NECESITA IMPLEMENTAR EN LA CLASE EL NUEVO MÉTODO CREADO EN LA INTERFAZ»
Este error se soluciona, añadiendo a la clase la implementación del método «restar»:
¿Qué hay de nuevo ahora en Java 8?
Podremos encontrarnos con un nuevo elemento en las interfaces: métodos por defecto. Estos métodos se caracterizan porque ya en la interfaz podemos declararles un comportamiento por defecto.
Estos métodos no se tienen que declarar en la clase que implementa a la interfaz, directamente podrán ser utilizados. Realizamos un método principal para probar las distintas operaciones que podremos realizar desde una Calculadora y vemos cómo podemos hacer uso del método multiplicar desde un objeto Calculadora sin que dicho método esté implementado en la clase Calculadora (esto se debe a que dicho método se ha declarado como método default en la interfaz ICalculadora):
Ahora bien, cabe destacar que los métodos que definimos default pueden ser redefinidos en las clases. Si al método multiplicar en Calculadora queremos darle un comportamiento diferente podríamos redefinir el método de la siguiente forma:
La prueba anterior ya no daría el mismo resultado ya que ahora la multiplicación se realiza entre los números 3 y 4.
Tras ver el ejemplo, cabe destacar que en una interfaz podremos añadir nuevos comportamientos por defecto (métodos default) que no tendrán por qué ser tratados en todas las clases que implementen a dicha interfaz pero sí podrán ser utilizados en todas ellas.