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();
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)
我认为你的观点是正确的,如果你确定你总是有一个返回值,你不应该使用Optional。
但你的方法不确定,它总是返回一个值!
考虑对getUserById(-1)的调用。(通常)没有具有此 id 的用户,并且您的userRepository将返回null。
所以在这种情况下你应该使用Optional.ofNullable。
https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#ofNullable-T-