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 unOptionalcon un valor no nulo. LanzaNullPointerExceptionsi el valor esnull.ofNullable(T value): Crea unOptionalcon un valor no nulo si existe, o unOptionalvacío si el valor esnull.empty(): Crea unOptionalvacío.isPresent(): Devuelvetruesi el valor está presente, de lo contrariofalse.isEmpty(): Devuelvetruesi el valor no está presente, de lo contrariofalse(añadido en Java 11).get(): Devuelve el valor si está presente, de lo contrario lanzaNoSuchElementException.orElse(T other): Devuelve el valor si está presente, de lo contrario devuelveother.orElseGet(Supplier<? extends T> other): Devuelve el valor si está presente, de lo contrario ejecuta y devuelve el resultado delSupplier. Es preferible aorElse(T other)cuando la inicialización deotheres costosa.orElseThrow(Supplier<? extends X> exceptionSupplier): Devuelve el valor si está presente, de lo contrario lanza la excepción proporcionada porexceptionSupplier.
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.