Sobes.tech
Middle

¿Qué sabes sobre la clase Optional?

sobes.tech AI

Respuesta de la IA

Optional<T> es una clase contenedora que puede contener un valor no nulo de tipo T o estar vacía. Se añadió en Java 8 para resolver el problema de los punteros nulos.

Métodos principales:

  • of(T value): Crea un Optional con un valor no nulo. Lanza NullPointerException si el valor es null.
  • ofNullable(T value): Crea un Optional con un valor no nulo si existe, o un Optional vacío si el valor es null.
  • empty(): Crea un Optional vacío.
  • isPresent(): Devuelve true si el valor está presente, de lo contrario false.
  • isEmpty(): Devuelve true si el valor no está presente, de lo contrario false (añadido en Java 11).
  • get(): Devuelve el valor si está presente, de lo contrario lanza NoSuchElementException.
  • orElse(T other): Devuelve el valor si está presente, de lo contrario devuelve other.
  • orElseGet(Supplier<? extends T> other): Devuelve el valor si está presente, de lo contrario ejecuta y devuelve el resultado del Supplier. Es preferible a orElse(T other) cuando la inicialización de other es costosa.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Devuelve el valor si está presente, de lo contrario lanza la excepción proporcionada por exceptionSupplier.

Ejemplo de uso para evitar NullPointerException:

// En lugar de
User user = findUserById(userId);
if (user != null) {
    String email = user.getEmail();
    // ...
}

// Se puede usar Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
    String email = user.getEmail();
    // ...
});

Comparación entre orElse y orElseGet:

// Ambas llamadas devolverán DefaultUser si optionalUser está vacío
// Pero en el caso de orElse, se llamará siempre a new DefaultUser(),
// incluso si optionalUser contiene un valor
User user1 = optionalUser.orElse(new DefaultUser());

// En el caso de orElseGet, new DefaultUser() solo se llamará
// si optionalUser está vacío
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Optional ayuda a hacer el código más legible y seguro, indicando claramente que el valor puede estar ausente. No debe usarse para campos de clases o parámetros de métodos si la ausencia del valor es una situación excepcional.