java - 使用 Optional.of() 有真正的理由吗?

标签 java nullpointerexception java-8 option-type

我读过 here为什么要使用Optional.of() 而不是Optional.ofNullable(),但是答案一点都不让我满意,所以我问的略有不同:

如果您确定您的方法不会返回 null,那么您为什么要使用 Optional?据我所知,它或多或少的唯一目的是提醒“方法的用户”,他可能必须处理 null 值。如果他不必处理 null 值,他为什么要为 Optional 而烦恼?

我问,因为我最近让我的服务层返回 Optionals 而不是空值(在某些情况下)。我使用了 Optional.of() 并在它抛出 NullPointer 时感到非常困惑。

我所做的示例:

Optional valueFromDB = getUserById("12");
User user = valueFromDB.get(); 

.....

public Optional<User> getUserById(String id) {
  //...
  return Optional.of(userRepository.findOne(id)); // NullPointerException!
}

如果 null 是不可能的,我不明白为什么要将它包装在 Optional 中。链接答案中的那个家伙说“好吧,如果发生 NullPointer,它会立即发生!”但我真的想要那样吗?如果 Optional 的唯一目的是提醒获得此类对象的程序员记住 null(他必须解包),我为什么要在包装时有 NullPointerException


编辑:我需要编辑问题,因为它被标记为重复,即使我已经从一开始就链接了上述问题。我也确实解释了,为什么答案不令我满意,但现在我需要用解释来编辑我的文本。 但这里有一些我想问的附录,因为我得到了 5 个答案,每个人都回答了不同的情况,但没有一个完全涵盖我在这里想问的问题:

Optional.of(null) 是不可能的,他们专门为 null 情况添加了 Optional.ofNullable() 是有原因的吗?

使用流应该不是我的实现想法的问题。 我从你的回答中得到了很多见解,谢谢。但据我所知/阅读/理解,真正的问题直到现在才得到解答。 也许我应该问:“如果我们删除 Optional.of() 方法并且只允许在 Java 9 中使用 Optional.ofNullable() 会怎么样,除了向后兼容?”

最佳答案

您将 API 设计原理与特定实现代码中的知识混为一谈。一个方法声明返回一个 Optional 是完全有可能的,因为该值可能不存在,而在方法内的某个代码位置,已知它肯定存在。即

String content;
public Optional<String> firstMatch(String pattern) {
    Matcher m = Pattern.compile(pattern).matcher(content);
    return m.find()? Optional.of(m.group()): Optional.empty();
}

此方法的返回类型表示可能不存在的 String,而在创建 Optional 实例的代码位置,已知值是否存在。这与在此处检测 null 值无关。

同样,在 Stream API 方法 findFirst()findAny() 中,会在某一时刻获知是否存在匹配元素,同时支持在匹配的 null 元素的情况下将其存在转换为不存在是明确不支持的,并且应该引发 NullPointerExceptionper specification .因此,Optional.of 将用于返回匹配的元素,您可以在使用 Stream.of((Object)null) .findAny();

关于java - 使用 Optional.of() 有真正的理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41181509/

相关文章:

java - 数组空指针异常?

java - 为什么静态 block 不能访问其后定义的静态变量

java - 通过eclipse启动应用程序和服务器时不创建tomcat日志

java - 使用 map 时获取 "java.lang.NullPointerException"

java - WSO2 Web服务空指针异常

java - NullPointerException 可能与 InheritableThreadLocal 有关

Java 8 流 : Read file word by word

java - 带有 Consumer 或 Filter 的 Java8 List 的条件,哪种方式更好

java - 将字符串转换为文本 (Java Hadoop)

java - 用PHP代替JAVA进行PKCS5加密