为什么使用 Optional.of 而不是 Optional.of 可空?

Why use Optional.of over Optional.ofNullable?

当使用 Java 8 Optional class 时,有两种方法可以将值包装在可选值中。

String foobar = <value or null>;
Optional.of(foobar);         // May throw NullPointerException
Optional.ofNullable(foobar); // Safe from NullPointerException

我知道 Optional.ofNullable 是使用 Optional 的唯一安全方法,但为什么 Optional.of 存在呢?为什么不直接使用 Optional.ofNullable 并始终保持安全?

你的问题是基于这样的假设,即可能抛出 NullPointerException 的代码比不会抛出的代码更糟糕。这个假设是错误的。如果您希望您的 foobar 由于程序逻辑而永远不会为 null,那么使用 Optional.of(foobar) 会好得多,因为您会看到 NullPointerException,这表明您的程序有错误。如果你使用了Optional.ofNullable(foobar),而foobar恰好是null,那么你的程序会默默地继续错误地工作,这可能是一个更大的灾难。这样一来,错误可能会发生得更晚,也更难理解是哪一点出错了。

此外,如果您知道如果对象为空,您的代码将无法运行,您可以使用 Optional.orElseThrow

抛出异常
String nullName = null;

String name = Optional.ofNullable(nullName)
                      .orElseThrow(NullPointerException::new);
                   // .orElseThrow(CustomException::new);

可选无论如何应该主要用于服务的结果。在服务中,您知道手头有什么,如果有结果,则 return Optional.of(someValue) ;如果没有,则 return Optional.empty() 。在这种情况下,someValue 永远不应该为 null,你仍然 return 一个 Optional.

这取决于场景。

假设您有一些业务功能,您需要进一步处理具有该值的东西,但在处理时具有 null 值会影响它。

那么,在那种情况下,你可以使用Optional<?>

String nullName = null;

String name = Optional.ofNullable(nullName)
                      .map(<doSomething>)
                      .orElse("Default value in case of null");