java java-8 optional

Java 8 Opcional. ¿Por qué de y de Nullable?



java-8 optional (6)

Esta pregunta ya tiene una respuesta aquí:

Tengo una pregunta con respecto a la Optional Java 8, cuyo propósito es abordar las excepciones NullPointerException .

La pregunta es, ¿cuál es la razón para que ambos tipos nos permitan elegir:

Optional.of(T value) <-----non-null value, null value will throw NPE Optional.ofNullable(T value) <----- nullable value

Porque lo que espero es, cuando uso:

Optional.of(nullValue);

No lanzará una NullPointerException .

Amplié mi pregunta después de algunas respuestas:

¿Por qué las personas optarían por Opcional en lugar de lo normal en if-else ?


¿Por qué las personas optarían por el método opcional en lugar del método normal if-else para la comprobación nula?

El punto principal de la clase Optional<T> es proporcionar una media para realizar operaciones de mapeo seguras nulas .

employeeOptional.map(Employee::getName).map(String::toUpperCase).ifPresent(upperCasedNameConsumer)

La expresión anterior puede reemplazar una cascada de sentencias if-else en una sola expresión legible.

Optional.of proporciona una aserción para que el argumento dado sea un valor null-null , de lo contrario, puede optar por Optional.ofNullable si no está seguro de la entrada.

Le recomiendo que lea el Optional para la clase Optional<T> opcional para obtener más métodos de encadenamiento opcionales que puede usar para su ventaja.


El propósito de la Opcional es abordar la excepción NullPointerException

Sí, lo es, pero en el momento de uso no en la creación.

Entonces, cuando recibe una Optional de un método, puede evitar NPE utilizando los métodos Optional.ifPresent , Optional.orElse , Optional.orElseGet y Optional.orElseThrow .

Pero este no es el caso cuando creas un Opcional. Dado que es su propio método, debe saber si el objeto es anulable o no.

El punto principal de Opcional es proporcionar un medio para que una función devuelva un valor para indicar la ausencia de un valor de retorno . Vea esta discusión . Esto permite a la persona que llama continuar con una cadena de llamadas de métodos fluidos.

Stuart Marks

Por favor, lea este post para una explicación más detallada.


Creo que es bastante simple y claro con Javadoc:

Optional.of(T value) se utiliza cuando está seguro de que nunca hay un valor null y en caso de que se produzca un valor nulo que el programa lanza la excepción NullPointerException y la considera un error.

Optional.ofNullable(T value) se usa cuando sabe que puede haber un valor null y, en caso de que su programa se comporte normalmente.

¿Por qué las personas optarían por el método opcional en lugar del método normal if-else para la comprobación nula?


Después de leer algunas respuestas y comentarios, creo que falta esta explicación. Considere un método como

public Optional<String> name(Customer c) { return c.isNew() ? Optional.ofNullable(getName(c)) : Optional.of(getName(c)); }

Aquí desea lanzar una NullPointerException si el cliente no es nuevo y se supone que tiene un nombre; su código es inconsistente si eso es null alguna vez. Sin embargo, es posible que el nombre aún no exista si el cliente es nuevo, por ofNullable tanto, de ofNullable en ese caso y el método devuelve Optional .


El javadoc de Optional.of lee eso explícitamente:

@throws NullPointerException if value is null

y ahí es donde el requisito de manejar los casos según lo esperado por usted entra en escena con el uso de Optional.ofNullable que es un pequeño bloque de código como:

public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); // ''Optional.of'' }

Dicho esto, la decisión de elegir uno sobre el otro aún residirá en el diseño de la aplicación como si su value pudiera ser null o no .

En su parte de expectativa, eso no era para lo que realmente se pretendía el Optional . La nota de la API aclara esto aún más (formateo mío):

Optional está destinado principalmente para su uso como un tipo de retorno de método donde existe una clara necesidad de representar "ningún resultado" y donde el uso de un null es probable que cause un error. Una variable cuyo tipo es Optional nunca debe ser null ; siempre debe apuntar a una instancia Optional .

El propósito de Optional es abordar la excepción NullPointerException.

Aparte : Solo para decirlo claramente, que la elección, por supuesto, le permitiría definir si un NPE debe lanzarse en tiempo de ejecución o no. Sin embargo, no está determinado en el momento de la compilación.


  • Optional.ofNullable es un contenedor alrededor de las API existentes que pueden devolver un null . Usted lo llamaría como un consumidor de una API.
  • Optional.of/Optional.empty es para el nuevo código escrito con Optional en mente. Devolvería una Optional creada con of/empty como proveedor de una API.