我读过 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
元素的情况下将其存在转换为不存在是明确不支持的,并且应该引发 NullPointerException
,per specification .因此,Optional.of
将用于返回匹配的元素,您可以在使用 Stream.of((Object)null) .findAny();
关于java - 使用 Optional.of() 有真正的理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41181509/