¿Por qué deberías usar Optional.orElseGet() en Java?

| Última modificación: 13 de diciembre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Cada que trabajo con valores nulos, temo que me aparezca el temido NullPointerException. Menos mal aprendí a usar Optional.orElseGet() en Java, un método muy seguro que me permite escribir código limpio y legible. Voy a enseñarte a usarlo para que aproveches todos los beneficios que te brinda.

Optional.orElseGet() en Java qué es

¿Qué es Optional.orElseGet() en Java?

Quiero que imagines una caja. Resulta que tú no sabes si esa caja está vacía o no. Entonces, para descubrirlo llamas a Optional.orElseGet() en Java y con su suplidor te da un valor, solo si es realmente necesario. En palabras más simples, cuando usas el orElseGet() estás diciendo algo como: “Si la caja está vacía, llama a esta persona para que te traiga algo”.

Recuerda muy bien que, este método de la clase optional te deja proporcionar un valor alternativo, si es que el valor original no está.

Firma del método

public T orElseGet(Supplier<? extends T> other)

Te explicaba que este método acepta un Supplier, o sea una interfaz funcional que genera un valor de tipo T solo cuando se necesita. Por eso el código que define el valor alternativo no se ejecuta a menos que el valor de Optional esté vacío.

orElse() y orElseGet(): ¿En qué se diferencian?

No quiero que te confundas, ten presente que orElse() y orElseGet() tienen un comportamiento muy distinto:

  1. orElse(): Este método siempre va a evaluar el valor alternativo, incluso si no se usa.
  2. orElseGet(): En cambio, este método solo ejecuta el código para generar el valor alternativo si el Optional está vacío.

No los uses por usarlos, recuerda esta diferencia para que no haya un gran impacto en el rendimiento, sobre todo si la lógica para obtener el valor alternativo es costosa.

Ejemplo básico

Imagina que tienes una base de datos y necesitas obtener el nombre de un usuario:

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

// Usando orElse()
String nameWithOrElse = user.orElse(fetchDefaultName());

// Usando orElseGet()
String nameWithOrElseGet = user.orElseGet(() -> fetchDefaultName());

En el caso de orElse(), el método fetchDefaultName() se ejecutará siempre, aunque el valor de user no sea nulo. Con orElseGet(), este método solo se ejecutará si el valor es realmente necesario.

Más ejemplos para aprender a usar Optional.orElseGet() en Java

Cálculos condicionales

Optional<Integer> number = Optional.empty();

int result = number.orElseGet(() -> computeExpensiveCalculation());

Puedes darte cuenta que, computeExpensiveCalculation() solo se ejecutará si el Optional está vacío.

Consultas a bases de datos

Optional<User> user = findUserById(1);

User result = user.orElseGet(() -> fetchDefaultUserFromDatabase());

De esta manera no se hará una consulta innecesaria a la base de datos si el usuario ya está presente.

Valores predeterminados complejos

Optional<List<String>> data = Optional.empty();

List<String> defaultData = data.orElseGet(() -> Arrays.asList("Valor1", "Valor2"));

¿Por qué deberías usar Optional.orElseGet()?

Mejora el rendimiento

Yo te aconsejo que, cuando vayas a hacer consultas a una base de datos o a realizar cálculos pesados, optes por usar Optional.orElseGet() en Java, ya que estarías usando una lógica complicada para generar un valor alternativo.

Comparativa de rendimiento

Un benchmark simple muestra la diferencia en tiempos de ejecución:

MétodoTiempo promedio (ns)
orElse()60,934
orElseGet()3.798

Mira bien que, Optional.orElseGet() en Java es significativamente más rápido porque no evalúa el valor alternativo hasta que realmente se necesita.

Evita crear objetos innecesarios

Incluso si el valor alternativo es un simple objeto, usar orElse() puede implicar crear ese objeto aunque no se utilice. Esto no sucede con orElseGet().

Ejemplo

String nameWithOrElse = user.orElse("OtroNombre");
// Siempre crea el objeto "OtroNombre", aunque no se use.

Con orElseGet() te quedaría así:

String nameWithOrElseGet = user.orElseGet(() -> "OtroNombre");
// Solo crea el objeto si es necesario.

Muy bueno para la lógica condicional

También te diré que, cuando el valor alternativo depende de cálculos dinámicos o lógica adicional, la mejor opción es orElseGet(), porque solo ejecutará esa lógica si el valor original no está presente.

Espero que ahora entiendas que, usar Optional.orElseGet() en Java no solo mejora el rendimiento de tu código, sino que también lo hace más limpio y manejable. Al aprovechar la evaluación diferida, puedes evitar cálculos innecesarios y garantizar que tu lógica se ejecuta solo cuando es realmente necesario.

Estaré encantado de enseñarte más sobre temas como este y que aprendas las mejores prácticas de programación. Solo tienes que inscribirte a nuestro Bootcamp de Java Full Stack en KeepCoding. Aprende a desarrollar aplicaciones de principio a fin y transforma tu carrera en poco tiempo. ¡Es hora de dar el salto al sector IT!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado