Saltar al contenido principal

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 un Optional que no contiene ningún valor.

    Optional<String> optionalVacio = Optional.empty();
  • Optional.of(T valor): Crea un Optional con el valor especificado. Si el valor es null, lanzará una excepción NullPointerException.

    Optional<String> optionalConValor = Optional.of("¡Hola!");
  • Optional.ofNullable(T valor): Crea un Optional que puede contener un valor o estar vacío si el valor es null.

    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ón NoSuchElementException.

    System.out.println(optional.get()); // "¡Hola!"

Ejemplo

Veamos un ejemplo de cómo podemos evitar el uso de null con Optional:

Usuario.java
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;
}
}
BaseDeDatos.java
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
}
}
EjemploOptionalSinStreams.java
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.");
}
}
}