Clase Optional de Java 8

Java 8 新特性Nuevas características de Java 8


La clase Optional es un objeto contenedor que puede ser null. Si el valor existe, el método isPresent() devuelve true, y al llamar al método get() devolverá ese objeto.

Optional es un contenedor: puede contener un valor de tipo T, o simplemente null. Optional proporciona muchos métodos útiles, de modo que no necesitamos realizar la detección de valores nulos explícitamente.

La introducción de la clase Optional resuelve muy bien la excepción de puntero nulo.

Declaración de clase

Lo siguiente es unajava.util.Optional<T>declaración de clase:

public final class Optional<T> extends Object

Métodos de clase

N.º Método y descripción
1 static <T> Optional<T> empty()

Devuelve una instancia de Optional vacía.

2 boolean equals(Object obj)

Determina si otro objeto es igual a este Optional.

3 Optional<T> filter(Predicate<? super <T> predicate)

Si el valor existe y coincide con el predicado dado, devuelve un Optional que describe este valor; de lo contrario, devuelve un Optional vacío.

4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

Si el valor existe, devuelve el valor basado en el método de mapeo contenido en el Optional; de lo contrario, devuelve un Optional vacío.

5 T get()

Si este Optional contiene el valor, devuelve el valor; de lo contrario, lanza la excepción: NoSuchElementException

6 int hashCode()

Devuelve el código hash del valor presente; si el valor no existe, devuelve 0.

7 void ifPresent(Consumer<? super T> consumer)

Si el valor existe, invoca al consumer con ese valor; de lo contrario, no hace nada.

8 boolean isPresent()

Si el valor existe, el método devuelve true; de lo contrario, devuelve false.

9 <U>Optional<U> map(Function<? super T,? extends U> mapper)

Si hay un valor, se le aplica la función de mapeo para obtener un valor de retorno. Si el valor de retorno no es null, crea un Optional que contiene el valor de retorno del mapeo como resultado del método map; de lo contrario, devuelve un Optional vacío.

10 static <T> Optional<T> of(T value)

Devuelve un Optional con el valor no nulo especificado.

11 static <T> Optional<T> ofNullable(T value)

Si no es nulo, devuelve un Optional que describe el valor especificado; de lo contrario, devuelve un Optional vacío.

12 T orElse(T other)

Si el valor existe, devuelve el valor; de lo contrario, devuelve other.

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

Si el valor existe, devuelve el valor; de lo contrario, invoca a other y devuelve el resultado de la llamada a other.

14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

Si el valor existe, devuelve el valor contenido; de lo contrario, lanza la excepción proporcionada por el Supplier.

15 String toString()

Devuelve una representación de cadena no vacía del Optional, para depuración.

Nota:Estos métodos sonjava.lang.Objectheredados de la clase.


Instancia de Optional

Podemos comprender mejor el uso de la clase Optional mediante el siguiente ejemplo:

Archivo Java8Tester.java

import 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 pasar un parámetro null. Optional<Integer> a = Optional.ofNullable(value1); //Optional.of - si el parámetro pasado es null, lanza la excepción NullPointerException Optional<Integer> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public Integer sum(Optional<Integer> a, Optional<Integer> b){ //Optional.isPresent - determina si el valor existe System.out.println("El valor del primer parámetro existe:" + a.isPresent()); System.out.println("El valor del segundo parámetro existe:" + b.isPresent()); //Optional.orElse - si el valor existe, lo devuelve; de lo contrario, devuelve el valor predeterminado Integer value1 = a.orElse(new Integer(0)); //Optional.get - obtiene el valor, el valor debe existir Integer value2 = b.get(); return value1 + value2; } }

Al ejecutar el script anterior, la salida es:

$ javac Java8Tester.java 
$ java Java8Tester
第一个参数值存在: false
第二个参数值存在: true
10

Java 8 新特性Nuevas características de Java 8

Otras extensiones