Optional es un objeto contenedor que puede o no contener un valor no nulo. Si el valor es presente, isPresent() devuelve true y get() retorna el valor.
1 2 3 | Package : java.util public final class Optional<T> extendsObject |
La siguiente es una lista de métodos útiles de la clase Optional.
1. Creación de métodos relativos a Optional:
Métodos: Optional.of, Optional.ofNullable, Optional.empty():
1 2 3 | Optional emptyOptional = Optional.empty(); Optional nonEmptyOptional = Optional.of("name"); // this will not work with null value Optional nonEmptyOptional = Optional.ofNullable(null); // this will work fine with null value |
2. Validar el valor de Optional
Métodos: Optional.isPresent(), Optional.ifPresent():
- isPresent() returna si Optional tiene un valor:
1 2 | Optional nonEmptyOptional = Optional.of("name"); assertTrue(nonEmptyOptional.isPresent()); |
- ifPresent() es igual a ejecutar un bloque de código si el valor esta presente.
Tenemos el siguiente código con validación de null antes del método Optional:
1 2 3 | if(data == null){ System.out.println( " data is " + data); } |
En este caso, cuando se trata de la validación de null, no se puede garantizar que data no se utilizarán sin una comprobación de null, y puede provocar la exception NullPointerException, si no se agregan la comprobación antes de usarla.
Ahora, con la opción de Optional, se puede utilizar ifPresent() para necesidades similares:
1 2 | Optional nonEmptyOptional = Optional.of("name"); nonEmptyOptional.ifPresent( x-> {System.out.println(x.length());}); |
3. Obtener el valor de Optional
- get() devuelve el valor que se encuentra en Optional
1 2 | Optional nonEmptyOptional = Optional.ofNullable("orignal"); String value = nonEmptyOptional.get(); |
- orElse() retorna un valor por defecto si el valor no se encuentra presente
1 2 3 4 5 6 7 8 | // orElse getting used as Optional has null value. Optional emptyOptional = Optional.ofNullable(null); String value = emptyOptional.orElse("default Value"); assertEquals("default Value", value); // orElse not getting used as Optional has non null value. Optional nonEmptyOptional = Optional.ofNullable("orginal"); String value1 = nonEmptyOptional.orElse("default Value"); assertEquals("orginal", value1); |
- orElseGet() similar a orElse(). Solo que en lugar de tomar valor, toma una función como la entrada cuando un valor no está presente en Optional.
1 2 3 4 5 6 7 8 | // orElse getting used as Optional has null value. Optional emptyOptional = Optional.ofNullable(null); String value = emptyOptional.orElseGet(()->"default value"); assertEquals("default value", value); // orElse not getting used as Optional has non null value. Optional nonEmptyOptional = Optional.ofNullable("orginal"); String value1 = nonEmptyOptional.orElseGet(()->"default value"); assertEquals("orginal", value1); |
- orElseThrow() similar a orElseGet; pero lanza una exception en caso de que el valor sea null.
1 2 3 4 5 6 | @Test(expected = NullPointerException.class) public void OrElseThrowCheck() { String nullName = null; String value = Optional.ofNullable(nullName).orElseThrow( NullPointerException::new); } |
4. Lista de métodos agregados a Optional en las nuevas versiones de Java.
- Java 9:
- or(): Si el valor esta presente, retorna el valor del Optional, en otro caso, retorna un Optional producido por la función proveedora.
- ifPresentOrElse(Consumer <? super T> action, Runnable emptyAction): Si el valor esta presente, realiza la acción dada por el valor, de lo contrario realiza la acción basada en el vacío.
- stream(): Si el valor esta presente, retorna un Stream secuencial conteniendo solo el valor; en otros caso retorna un valor vacío.
- Java 10:
- orElseThrow(): Si el valor esta presente, retorna el valor; en otro caso, este retorna a NoSuchElementException. Este no acepta otro argumento como Java 8.
- Java 11:
- isEmpty(): Si el valor no esta presente, este retorna true; en otro caso, falso
5. Código completo
Puede revisar el código completo en:
Este artículo se encuentra basado en A Look at Java Optionals.