Ir al contenido principal

Java Tip 24: conociendo la clase Optional

La documentación oficial nos dice:

Optional en Java es una clase de Java 8 que actúa como un contenedor para un valor que puede estar presente o no. Se utiliza para gestionar explícitamente los valores nulos y evitar NullPointerException, haciendo el código más claro y seguro. En lugar de retornar un valor null, que puede provocar errores, Optional permite crear objetos que pueden estar vacíos o contener un valor, lo que requiere que el programador maneje explícitamente el caso de que no haya valor.

Con la clase Optional podemos:

  • Evitar el riesgo de un NullPointerException.
  • Checar si un valor existe o no. 
  • Recuperar un valor está presente o no. 
  • Ejecutar acciones en función si el valor esta presente o no.

Esta clase promueve un estilo de programación más seguro y expresivo.

Importamos esta clase:

import java.util.Optional;

Una vez importada la podremos usar. Veamos la clase:

public final class Optional<T>{}

Como se puede ver se trata de una clase genérica, lo cual nos permite que el objeto que contenga (o no) sea de cualquier clase.

Existen varias formas para crear una variable tipo Optional :

1. Forma vacía:

Optional<String> optionalStrEmpty = Optional.empty();

Optional<Boolean> optionalBoolEmpty = Optional.empty();

Optional<Empleado> optionalEmpleadoEmpty = Optional.empty();

Uso:

optionalStrEmpty.ifPresent(str -> System.out.println("Hola, "+str));

optionalBoolEmpty.ifPresent(b -> {
  if(b){
       Systemout.print("\nHola");
  }
});


if(optionalEmpleadoEmpty.isPresent()) {
    System.out.println("El empleado existe");
 }

2. Con valor distinto a nulo:

Optional<String> nonEmptyOptional = Optional.of("Hello");
Optional<Boolean> nonEmptyBoolOptional = Optional.of(true);
Optional<Boolean> nonEmptyEmpOptional = Optional.of(new Empleado());

Uso:

String valorStr = nonEmptyOptional.get();
Boolean valorBool = nonEmptyBoolOptional.get();
Empleado valorEmp = nonEmptyEmpOptional.get();

3. Con un valor nulo:

Optional<String> nullableOptional = Optional.ofNullable(null);

Uso:

public Optional<String> buscarUsuario(String id) {
    if ("123".equals(id)) {
        return Optional.of("Usuario encontrado");
    }
    return Optional.empty();
}


// Uso
Optional<String> obtEmp = this.buscarUsuario(nullableOptional); 

En pocas palabras:

  • Optional.of(value) → crea un Optional con un valor no nulo. 
  • Optional.ofNullable(value) → crea un Optional que puede ser nulo. 
  • Optional.empty() → crea un Optional vacío.

Métodos principales de la clase genérica Optional

Algunos de los métodos principales son:

  • isPresent() → devuelve true si hay valor. 
  • ifPresent(Consumer) → ejecuta una acción si hay valor. 
  • get() → obtiene el valor (lanza excepción si está vacío). 
  • orElse(defaultValue) → devuelve el valor o un valor por defecto. 
  • orElseGet(Supplier) → similar a orElse, pero recibe un proveedor. 
  • orElseThrow() → lanza excepción si está vacío.

Aquí una tabla que muestra un resumen de los métodos principales de la clase Optional :

Método Propósito Retorno Uso común Nota clave
Optional.of(value) Crear un Optional con valor no nulo Optional<T> Cuando sabes que el valor existe Lanza NullPointerException si value es null
Optional.ofNullable(value) Crear un Optional que acepta nulos Optional<T> En entradas/retornos que pueden ser null Si value es null, devuelve Optional.empty()
Optional.empty() Representar ausencia explícita de valor Optional<T> Retornos de métodos cuando no hay resultado Útil para evitar null
isPresent() Verificar si hay valor boolean Checks rápidos (no recomendado en estilo funcional) Prefiere ifPresent / orElse
isEmpty() Verificar si está vacío boolean Java 11+ para legibilidad inversa Equivalente a !isPresent()
ifPresent(Consumer) Ejecutar acción si hay valor void Side effects controlados No opera si está vacío
ifPresentOrElse(Consumer, Runnable) Acciones para presente/ausente void Java 9+, flujo claro Útil para bifurcar lógica
get() Obtener el valor T Evita su uso; puede lanzar excepción Lanza NoSuchElementException si está vacío
orElse(default) Valor o por defecto T Por defecto barato/constante Evalúa default siempre (aunque haya valor)
orElseGet(Supplier) Valor o proveedor diferido T Por defecto costoso (lazy) Ejecuta Supplier solo si está vacío
orElseThrow() Lanzar excepción si vacío T Forzar presencia Lanza NoSuchElementException por defecto
orElseThrow(Supplier) Lanzar excepción personalizada T Mensajes/Tipos de excepción claros Proveedor ejecuta solo si está vacío
map(Function) Transformar valor presente Optional<U> Encadenar transformaciones No ejecuta si está vacío
flatMap(Function) Transformar y aplanar Optional<Optional<U>> Optional<U> Evitar anidación de Optional La función debe devolver Optional
filter(Predicate) Mantener valor si cumple condición Optional<T> Validaciones inline Devuelve empty si no cumple

Recomendaciones:

  • Usar Optional como tipo de retorno, no como parámetro ni atributo de clase. 
  • Evitar abusar de get(), preferir orElse, orElseGet o ifPresent
  • Ideal para flujos con Streams y operaciones funcionales

Enlaces:

https://adictosaltrabajo.com/2015/03/02/optional-java-8/
https://medium.com/@pratik.941/mastering-optional-in-java-8-a-comprehensive-guide-3131eac600dc




Comentarios

Entradas populares de este blog

Java Tip 20: JDBC (2da parte)

Continuamos con esta serie sobre JDBC . Como dijimos la vez anterior JDBC( Java Database Connectivity ) es el estándar de conectividad de bases de datos de Java y proporciona un mecanismo para que los programas Java se conecten a las bases de datos. En este post veremos ejemplos de su uso. Requisitos: Tener nociones de Java.  Tener nociones de SQL (usaremos H2). Tener nociones de Maven. Creando una aplicación JDBC Crearemos una sencilla aplicación que se conecte a una BD H2 (ver  tutorial ). Pasos: Crearemos una tabla a la que llamaremos Cursos. La cual tendrá los siguientes campos: id, titulo, materia, instructor, fecha y hora. Crear la aplicación Java usando Maven. Crearemos instrucciones SQL para consultar la información, ingresar nuevos cursos, actualizar y eliminar registros. Ejecutar la aplicación con Maven. 1. Creamos la tabla con sus seis campos (agregaremos los datos con la aplicación Java): CREATE OR REPLACE TABLE CURSOS( id bigint ...

Lo nuevo de Java desde la versión 12 hasta la 22

Aquí unos enlaces a varias publicaciones sobre algunos nuevos aspectos del lenguaje Java, desde la versión 12 a la 22. Expresiones Switch en Java Una nueva funcionalidad en el lenguaje: las expresiones switch. https://emanuelpeg.blogspot.com/2025/01/expresiones-switch-en-java.html API de Servidor Web Simple en Java Una API de Servidor Web Simple que permite crear servidores HTTP ligeros sin necesidad de dependencias externas. https://emanuelpeg.blogspot.com/2025/02/api-de-servidor-web-simple-en-java.html Clases Record Una implementación de las data-clases o del patrón Data Transfer Object, un tipo de clase cuyo único propósito es impulsar la programación con datos inmutables. https://alquimistadecodigo.blogspot.com/2025/02/java-clases-record.html https://emanuelpeg.blogspot.com/2025/02/record-en-java.html Clases Selladas y coincidencia de patrones en Java https://emanuelpeg.blogspot.com/2025/03/clases-selladas-y-coincidencia-de.html https://emanuelpeg.blogspo...

Java Tip 21: preguntas sobre Programación Orientada a Objetos en Java

  Nota: Este post esta basado en un artículo de linkedin llamado " Top 50 OOPs Interview Questions & Answers ". 1. ¿Qué es la POO? Es la abreviatura de Programación Orientada a Objetos . Es un paradigma de programación en la cual los programas son considerados como una colección de objetos y cada uno de esos objetos se considera una instancia de una clase. Una clase es una plantilla o modelo para crear objetos. Digamos una representación de un tipo de objeto (una casa, un mueble, una persona, etc.).  2. ¿Cuáles son los conceptos básicos de la POO? Abstracción. Encapsulación Herencia. Polimorfismo. 3. ¿Qué es la Abstracción? Es el ocultamiento de los detalles de implementación y mostrar solo las características esenciales de un objeto. 4. ¿Qué es la Encapsulación? Es un atributo de un objeto, y contiene todos los datos ocultos. Estos datos ocultos pueden restringirse a los miembros de la clase. Los niveles de acceso pueden ser: default , public , protected y    p...