Clase Optional
La clase Optional<T> en Java fue introducida en Java 8 como parte del paquete java.util. Esta clase proporciona un mecanismo elegante para representar valores opcionales, es decir, valores que pueden o no estar presentes. Es muy útil para evitar el uso de null y las temidas excepciones NullPointerException.
Instanciar un objeto Optional
Hay varias formas de crear un objeto Optional:
-
Optional.empty(): Crea unOptionalque no contiene ningún valor.Optional<String> optionalVacio = Optional.empty(); -
Optional.of(T valor): Crea unOptionalcon el valor especificado. Si el valor esnull, lanzará una excepciónNullPointerException.Optional<String> optionalConValor = Optional.of("¡Hola!"); -
Optional.ofNullable(T valor): Crea unOptionalque puede contener un valor o estar vacío si el valor esnull.Optional<String> optionalNullable = Optional.ofNullable(null); // Optional vacío
Optional<String> optionalNullableConValor = Optional.ofNullable("¡Hola!");
Métodos de Optional
Los principales métodos de Optional son:
-
isPresent(): Comprueba si el valor está presente.Optional<String> optional = Optional.of("¡Hola!");
System.out.println(optional.isPresent()); // true -
get(): Devuelve el valor almacenado si está presente. Si está vacío, lanza una excepciónNoSuchElementException.System.out.println(optional.get()); // "¡Hola!"
Ejemplo
Veamos un ejemplo de cómo podemos evitar el uso de null con Optional:
class Usuario {
private String id;
private String nombre;
public Usuario(String id, String nombre) {
this.id = id;
this.nombre = nombre;
}
public String getId() {
return id;
}
public String getNombre() {
return nombre;
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
class BaseDeDatos {
private List<Usuario> usuarios;
public BaseDeDatos() {
usuarios = new ArrayList<>();
usuarios.add(new Usuario("1", "Ana"));
usuarios.add(new Usuario("2", "Bruno"));
usuarios.add(new Usuario("3", "Carmen"));
}
// Buscar usuario por ID sin usar streams
public Optional<Usuario> buscarUsuarioPorId(String id) {
for (Usuario usuario : usuarios) {
if (usuario.getId().equals(id)) {
return Optional.of(usuario); // Retorna un Optional con el usuario encontrado
}
}
return Optional.empty(); // Si no se encuentra, retorna un Optional vacío
}
}
public class EjemploOptionalSinStreams {
public static void main(String[] args) {
BaseDeDatos baseDeDatos = new BaseDeDatos();
String idExistente = "1";
Optional<Usuario> usuario1 = baseDeDatos.buscarUsuarioPorId(idExistente);
if (usuario1.isPresent()) {
System.out.println("Usuario encontrado: " + usuario1.get().getNombre());
} else {
System.out.println("Usuario no encontrado.");
}
}
}