Cuando se usa la Optionalclase Java 8 , hay dos formas en que un valor se puede ajustar de forma opcional.
String foobar = <value or null>;
Optional.of(foobar); // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException
Entiendo que Optional.ofNullablees la única forma segura de usar Optional, pero ¿por qué Optional.ofexiste? ¿Por qué no solo usar Optional.ofNullable y estar seguro en todo momento?

java.util.Optional: está disponible si está utilizando JDK 8 o posteriorofNullable()nombradoof()yof()nombradoofNotNull()Respuestas:
Su pregunta se basa en la suposición de que el código que puede arrojar
NullPointerExceptiones peor que el código que no puede arrojar . Esta suposición está mal. Si espera quefoobarnunca sea nulo debido a la lógica del programa, es mucho mejor usarlo,Optional.of(foobar)ya que verá unaNullPointerExceptionque indicará que su programa tiene un error. Si lo usaOptional.ofNullable(foobar)yfoobarsenulldebe al error, su programa continuará funcionando incorrectamente en silencio, lo que puede ser un desastre mayor. De esta manera, un error puede ocurrir mucho más tarde y sería mucho más difícil de entender en qué momento salió mal.fuente
Optional.of(foobar)". Esto parece un poco extraño: cuando sabemos que el valor no seránullen ningún caso, ¿por qué no usar el valor en sí mismo, en lugar de envolverlo dentro de unOptional?Optionalmétodo según lo requiera la interfaz que está implementando (probablemente otros implementadores pueden devolver una opción vacía). O desea crear una colección / secuencia de opciones, algunas de las cuales están garantizadas como no nulas y otras no. O tiene una lógica condicional que crea un opcional en varias ramas y en una sola rama está seguro de que no es nulo.nullen este caso significa "Espero que foobar esté presente, pero debido a un error es nulo".Optional.isPresent() == falsesignifica que foobar no está presente, es decir, esto se espera, comportamiento legítimo.return list.isEmpty()? Optional.empty(): Optional.of(list.get(0));lalistse espera que no contienennullvalores ...Además, si sabe que su código no debería funcionar si el objeto es nulo, puede lanzar una excepción utilizando
Optional.orElseThrowfuente
String name = Objects.requireNonNull(nullName);NullPointerExceptioncuando el problema es claramente una referencia que es,nullaunque no debería, sería un paso en la dirección equivocada.new NullNameException("meaningful msg")Esto depende de los escenarios.
Digamos que tiene alguna funcionalidad comercial y necesita procesar algo con ese valor aún más, pero tener
nullvalor en el momento del procesamiento lo afectaría.Entonces, en ese caso, puedes usar
Optional<?>.fuente
Opcional debe usarse principalmente para resultados de Servicios de todos modos. En el servicio, sabe lo que tiene a mano y devuelve Opcional.of (someValue) si tiene un resultado y devuelve Opcional.empty () si no lo tiene. En este caso, algún valor nunca debe ser nulo y aún así, devuelve un Opcional.
fuente