Optional<T> es un contenedor que puede o no contener un valor no nulo. Su propósito es modelar explícitamente la ausencia de valor sin recurrir a null, eliminando NullPointerException y documentando la intención en la firma del método.
Introducido en Java 8, Optional es especialmente útil como tipo de retorno de métodos que pueden no encontrar un resultado (repositorios, búsquedas...).
Regla de oro: usa
Optionalcomo tipo de retorno. Nunca como parámetro de método, campo de clase o en colecciones.
Creación:
Optional<String> lleno = Optional.of("valor"); // lanza NPE si null
Optional<String> nullable = Optional.ofNullable(valor); // acepta null → Optional.empty()
Optional<String> vacío = Optional.empty();Extracción segura:
| Método | Comportamiento |
|---|---|
orElse(T) |
Devuelve el valor o el default (siempre evalúa el default) |
orElseGet(Supplier) |
Devuelve el valor o invoca el Supplier (lazy) |
orElseThrow(Supplier) |
Devuelve el valor o lanza excepción |
ifPresent(Consumer) |
Ejecuta si hay valor |
isPresent() |
Comprueba si hay valor |
Transformación:
optional.map(String::toUpperCase) // transforma si presente
.filter(s -> s.length() > 3) // filtra si presente
.flatMap(s -> buscarOtro(s)) // cuando map devuelve Optional- Elimina
NullPointerExceptionde forma explícita. - Documenta en la firma que un método puede no devolver valor.
- Composición fluida con
map,filter,flatMap. - Fuerza al llamador a manejar el caso ausente.
Ver ExpOptional.java, ExpOptionalChaining.java, ExpOptionalVsException.java y ExpOptionalAntipatterns.java para ejemplos ejecutables con of, ofNullable, map, flatMap, filter, orElse, orElseGet y orElseThrow.