Java SE 8 presenta una nueva clase llamada java.util.Optional que se inspira en las ideas de Haskell y Scala. Es una clase que encapsula un valor opcional1. Puede ver Opcional como un contenedor de valor único que contiene un valor o no (entonces se dice que está “vacío” ).
Vídeo explicativo
Creación de objetos Optional
Hay varias formas de crear objetos opcionales.
Para crear un objeto opcional vacío, simplemente necesitamos usar su método estático empty():
Optional<String> empty = Optional.empty();
También podemos crear un objeto Opcional con el método estático of().
Sin embargo, el argumento pasado al método of() no puede ser nulo. De lo contrario, obtendremos una NullPointerException:
Optional<String> opt = Optional.of("Hola Mundo");
// Esto nos devolvera NullPointerException
Optional<String> opt = Optional.of(null);
Pero en caso de que esperemos algunos valores nulos, podemos usar el método ofNullable(). Al hacer esto, si pasamos una referencia nula, no arroja una excepción sino que devuelve un objeto opcional vacío:
Optional<String> opt = Optional.ofNullable(null);
// Aqui retornará true
bool estaVacion = opt.isEmpty()
Usando ifPresent()
El método ifPresent() nos permite ejecutar algún código en el valor envuelto si se encuentra que no es nulo. Antes de Optional, haríamos:
if(name != null) {
System.out.println(name.length());
}
Sin embargo, usando el método ifPresent() de la clase Optional, podemos utilizar una expresión lambda para ejecutar nuestra lógica de negocio si el valor de nuestro Optional es vacío:
Optional<String> opt = Optional.of("Hola Mundo");
opt.ifPresent(valor -> System.out.println(valor.length()));
orElse()
El método orElse() se usa para recuperar el valor envuelto dentro de una instancia opcional. Toma un parámetro, que actúa como un valor predeterminado. El método orElse() devuelve el valor envuelto si está presente y su argumento en caso contrario:
String nombrePrincipal= null;
String nombre = Optional.ofNullable(nullName).orElse("Ricardo");
orElseThrow()
El método orElseThrow() se deriva de orElse() y agrega un nuevo enfoque para manejar un valor vacío. En lugar de devolver un valor predeterminado cuando el valor envuelto no está presente, genera una excepción:
String nombrePrincipal = null;
String nombre = Optional.ofNullable(nombrePrincipal).orElseThrow(IllegalArgumentException::new);
get()
El enfoque final para recuperar el valor envuelto es el método get(). Sin embargo, a diferencia de los tres enfoques anteriores, get() solo puede devolver un valor si el objeto envuelto no es nul,; de lo contrario, arroja una excepción: