Dominando Optional en Java 8: Guía Práctica para Código Seguro contra Nulos
Optional es un objeto contenedor diseñado para almacenar valores no nulos. Representa la ausencia de un valor en lugar de usar null, proporcionando métodos de utilidad que facilitan el manejo de valores como "disponibles" o "no disponibles", eliminando la necesidad de comprobaciones explícitas de nulidad. Introducido en Java 8, es conceptualmente similar a Optional de Guava.
Declaración de la Clase
La declaración para la clase java.util.Optional<T> es la siguiente:
public final class Optional<T> extends Object
Métodos Principales
| Nº | Método y Descripción |
|---|---|
| 1 | static <T> Optional<T> empty() Devuelve una instancia vacía de Optional. |
| 2 | boolean equals(Object obj) Indica si otro objeto es "igual a" este Optional. |
| 3 | Optional<T> filter(Predicate<? super T> predicate) Si hay un valor presente y coincide con el predicado dado, devuelve un Optional que lo describe; en caso contrario, devuelve un Optional vacío. |
| 4 | <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) Si hay un valor presente, aplica la función de mapeo que devuelve Optional y devuelve ese resultado; en caso contrario, devuelve un Optional vacío. |
| 5 | T get() Si hay un valor presente, lo devuelve; en caso contrario, lanza |
| 6 | int hashCode() Devuelve el código hash del valor presente, o 0 si no hay valor. |
| 7 | void ifPresent(Consumer<? super T> consumer) Si hay un valor presente, invoca el consumidor especificado con el valor; en caso contrario, no hace nada. |
| 8 | boolean isPresent() Devuelve |
| 9 | <U> Optional<U> map(Function<? super T, ? extends U> mapper) Si hay un valor presente, aplica la función de mapeo y, si el resultado no es nulo, devuelve un Optional que describe el resultado. |
| 10 | static <T> Optional<T> of(T value) Devuelve un Optional con el valor no nulo especificado. Lanza |
| 11 | static <T> Optional<T> ofNullable(T value) Devuelve un Optional que describe el valor especificado si no es nulo; en caso contrario, devuelve un Optional vacío. |
| 12 | T orElse(T other) Devuelve el valor si está presente; en caso contrario, devuelve |
| 13 | T orElseGet(Supplier<? extends T> other) Devuelve el valor si está presente; en caso contrario, invoca |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) Devuelve el valor contenido si está presente; en caso contrario, lanza una excepción creada por el proveedor especificado. |
| 15 | String toString() Devuelve una representación en cadena no vacía de este Optional, adecuada para depuración. |
Esta clase hereda métodos de:
- java.lang.Object
Ejemplo Práctico
Crea el siguiente programa Java en, por ejemplo, C:\JAVA.
Java8Tester.java
Demo en vivoimport java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable permite que el parámetro sea null
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of lanza NullPointerException si el parámetro es null
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// isPresent verifica si el valor está presente
System.out.println("El primer parámetro está presente: " + a.isPresent());
System.out.println("El segundo parámetro está presente: " + b.isPresent());
// orElse devuelve el valor si está presente, sino el valor por defecto
Integer value1 = a.orElse(new Integer(0));
// get obtiene el valor (debe estar presente)
Integer value2 = b.get();
return value1 + value2;
}
}
Verificar el Resultado
Compila la clase usando el compilador javac:
C:\JAVA>javac Java8Tester.java
Ejecuta el programa:
C:\JAVA>java Java8Tester
Debería producir la siguiente salida:
El primer parámetro está presente: false El segundo parámetro está presente: true 10
Java
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
- Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación
- Mejoras en Java 9: Nuevas Características para la Clase Optional