Funcion ifPresentOrElse de la Clase Optional en Java +8

JJOC007
3 min readJan 13, 2023

Se trata de un método de la clase Optional que nos permite ejecutar diferentes acciones dependiendo de si el valor contenido en el objeto Optional está presente o no. Veremos cómo se utiliza y cómo nos puede ayudar a manejar valores opcionales de manera más sencilla.

La clase Optional es una de las clases más importantes del paquete java.util de Java. Se utiliza para representar valores que pueden o no estar presentes. Por ejemplo, si tenemos una función que puede devolver un valor o lanzar una excepción si no lo encuentra, podemos usar un objeto Optional para contener ese valor de forma segura. De esta manera, podemos evitar trabajar con null, que puede ser una fuente común de errores en el código.

El método ifPresentOrElse es una forma conveniente de manejar diferentes escenarios dependiendo de si el valor contenido en el objeto Optional está presente o no. Podemos ejecutar una acción si el valor está presente, o podemos ejecutar otra acción si el valor no está presente. Veremos cómo funciona con un ejemplo práctico.

Veamos algunos ejemplos de cómo se utiliza la función ifPresentOrElse:

Ejemplo 1: Imprimir el valor de un Optional si existe, o imprimir un mensaje de error si no existe:

Optional<String> optionalString = Optional.of("Hello World!");

optionalString.ifPresentOrElse(
(value) -> System.out.println(value),
() -> System.out.println("No value found.")
);

Ejemplo 2: Realizar una operación matemática si existe un valor en un Optional, o lanzar una excepción si no existe:

Optional<Integer> optionalInteger = Optional.of(5);

optionalInteger.ifPresentOrElse(
(value) -> System.out.println(value * value),
() -> { throw new IllegalArgumentException("No value found."); }
);

Ejemplo 3: Encadenar varias llamadas a ifPresentOrElse para realizar varias acciones en diferentes escenarios:

Optional<Person> optionalPerson = Optional.of(new Person("John", "Doe"));

optionalPerson.ifPresentOrElse(
(value) -> {
System.out.println("First name: " + value.getFirstName());
System.out.println("Last name: " + value.getLastName());
},
() -> System.out.println("No person found.")
);

Ejemplo 4: Encadenar varias llamadas a ifPresentOrElse para realizar varias acciones en diferentes escenarios y con una clase personalizada:

class Person {
private String firstName;
private String lastName;
private int age;
private Address address;
// constructor, getters and setters
}

class Address {
private String street;
private String city;
private String state;
private String zip;
// constructor, getters and setters
}

Optional<Person> optionalPerson = Optional.of(new Person("John", "Doe", 30, new Address("Street", "city", "state", "zip")));

optionalPerson.ifPresentOrElse(
(value) -> {
System.out.println("Full Name: " + value.getFirstName() + " " + value.getLastName());
System.out.println("Age: " + value.getAge());
Optional.ofNullable(value.getAddress()).ifPresentOrElse(
(address)-> System.out.println("Address: " + address.getStreet() + " " + address.getCity() + " " + address.getState() + " " + address.getZip()),
()-> System.out.println("No address found.")
);
},
() -> System.out.println("No person found.")
);

Ejemplo 5: Utilizando ifPresentOrElse para ejecutar una operación de base de datos en una aplicación web:

class DbService {
public void insert(Person person) {
// Insert a person into the database
}
public Person select(String id) {
// Select a person from the database by id
}
}

DbService dbService = new DbService();
Optional<Person> optionalPerson = Optional.ofNullable(dbService.select("123"));
optionalPerson.ifPresentOrElse(
(value) -> {
System.out.println("Person found in database: " + value.getFirstName() + " " + value.getLastName());
},
() -> {
System.out.println("Person not found in database. Inserting new person.");
Person person = new Person("Jane", "Doe", 25);
dbService.insert(person);
}
);

La función ifPresentOrElse tiene dos parámetros: un consumer y un runnable. El parámetro consumer es una acción a realizar si el valor contenido en el objeto Optional está presente. Por ejemplo, podemos imprimir el valor, guardarlo en una variable o enviarlo a otra función para su procesamiento. El parámetro consumer se define mediante una expresión lambda, que es una forma concisa de escribir una implementación de una interfaz funcional como Consumer.

Por otro lado, el parámetro runnable es una acción a realizar si el valor contenido en el objeto Optional no está presente. Por ejemplo, podemos imprimir un mensaje de error, lanzar una excepción o ejecutar otra lógica de negocio. Al igual que el parámetro consumer, el parámetro runnable se define mediante una expresión lambda.

La función ifPresentOrElse es una herramienta poderosa en Java que permite ejecutar acciones específicas en función de si un objeto Optional contiene un valor o no. Con la combinación de diferentes acciones en los parámetros consumer y runnable, y la capacidad de encadenar varias llamadas, se pueden crear flujos de trabajo muy flexibles y robustos.

👏 👏

--

--