是否有使用Optional.of()的真正原因?

cod*_*leb 10 java nullpointerexception optional java-8

我在这里读到为什么Optional.of()要使用它Optional.ofNullable(),但答案根本不能满足我,所以我要求略有不同:

如果您确定您的方法没有返回null,为什么要使用它Optional?据我所知,它或多或少的唯一目的是提醒"方法的用户",他可能不得不处理 - 值null.如果他不必处理价值,null他为什么要被一个人打扰Optional呢?

我问,因为我最近使我的服务层返回Optionals而不是nulls(在某些情况下).当我Optional.of()抛出NullPointer时,我使用并且非常困惑.

我做的一个样本:

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

.....

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

如果无法使用null,我不明白为什么会把它包装成一个Optional.链接答案中的家伙说:"好吧,如果NullPointer发生,它会马上发生!" 但我真的想要吗?如果一个人的唯一目的Optional是提醒那些得到这样一个对象的程序员,请null记住(他有必要打开它),为什么我想要NullPointerException在包装时?


编辑:我需要编辑问题,因为它被标记为重复,即使我已经从一开始就链接了所述问题.我也解释过,为什么答案不能让我满意,但现在我需要用一个解释来编辑我的文字.但是这里有一些我想问的附录,因为我得到了5个答案,每个人都回答了不同的案例,但没有一个完全覆盖我在这里要求的内容:

有没有理由,Optional.of(null)是不可能的,他们专门为null case添加了Optional.ofNullable()?

使用流不应该是我对实现的想法的问题.我从你的答案中得到了很多见解,谢谢你.但到目前为止,真正的问题还没有得到解答,据我所知/读/理解.也许我应该问:"如果我们删除该Optional.of()方法并且仅允许Optional.ofNullable()在Java 9中,除了向后兼容性之外会有什么问题吗?"

Hol*_*ger 11

您正在将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();
}
Run Code Online (Sandbox Code Playgroud)

此方法的返回类型表示String可能不存在的类型,而在创建Optional实例的代码位置处,可以知道该值是存在还是不存在.这不是关于null在这里检测一个值.

同样地,流API方法中findFirst()findAny(),将在一个点上已知的,是否有匹配元件,而支撑它的存在对不存在的转化在匹配的情况下,null元件是明确地不支持的和应该养NullPointerException,每规范.因此,Optional.of将用于返回匹配元素,使用时可以在堆栈跟踪中轻松识别Stream.of((Object)null) .findAny();


mar*_*kin 7

Optional.of(value)当你知道value不能为null 时使用的另一个原因是,如果你想对它做另外的过滤操作Optional.

例如:

public static long getPageSizeFrom(HttpServletRequest request) {
    return Optional.of(request.getParameter("pageSize"))
                   .filter(StringUtils::isNumeric)
                   .map(Long::valueOf)
                   .filter(page::hasPageSize)
                   .orElse(page::getDefaultPageSize)
}
Run Code Online (Sandbox Code Playgroud)


Tob*_*tto 2

我认为你的观点是正确的,如果你确定你总是有一个返回值,你不应该使用Optional。

你的方法不确定,它总是返回一个值!

考虑对getUserById(-1)的调用。(通常)没有具有此 id 的用户,并且您的userRepository将返回null

所以在这种情况下你应该使用Optional.ofNullable。

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#ofNullable-T-

  • 是的,但问题是,为什么 `Optional.of()` 存在。 (6认同)