现在已经使用Java 8超过6个月左右,我对新的API更改感到非常满意.我仍然不自信的一个领域是什么时候使用Optional.我似乎想要在任何可能的null地方使用它,而且无处可去.
似乎有很多情况我可以使用它,我不知道它是否增加了好处(可读性/无效安全性)或只是导致额外的开销.
所以,我有一些例子,我对社区是否Optional有益的想法感兴趣.
1 - 当方法可以返回时作为公共方法返回类型null:
public Optional<Foo> findFoo(String id);
Run Code Online (Sandbox Code Playgroud)
2 - 当参数可能是null以下时作为方法参数:
public Foo doSomething(String id, Optional<Bar> barOptional);
Run Code Online (Sandbox Code Playgroud)
3 - 作为bean的可选成员:
public class Book {
private List<Pages> pages;
private Optional<Index> index;
}
Run Code Online (Sandbox Code Playgroud)
4 - 在Collections:
一般来说,我不认为:
List<Optional<Foo>>
Run Code Online (Sandbox Code Playgroud)
添加任何东西 - 特别是因为可以使用filter()删除null值等,但是Optional在集合中是否有任何好的用途?
我错过了什么案例?
我有一个关于Java 8的Optional的问题,其目的是解决NullPointerException异常问题.
问题是,让两种类型让我们选择的原因是什么:
Optional.of(T value) <-----non-null value, null value will throw NPE
Optional.ofNullable(T value) <----- nullable value
Run Code Online (Sandbox Code Playgroud)
因为我的期望是,当我使用时:
Optional.of(nullValue);
Run Code Online (Sandbox Code Playgroud)
它不会抛出一个NullPointerException.
一些回复后扩大了我的问题:
为什么人们会选择Optional而不是普通if-else的null检查?
Java 8引入了Optional来处理NPE.在实际应用中,我无法理解问题.
我有方法A.
public void doSomethingA(String para) {
Optional<String> name = Optional.of(para);
if (name.isPresent()) {
//do
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果para = null,它将抛出NPE.
方法B.
public void doSomethingB(String para) {
if (para != null) {
//do
}
}
Run Code Online (Sandbox Code Playgroud)
如果我检查para不为空,A和B之间有什么区别.
Optional的含义在哪里.
我在这里读到了为什么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中,除了向后兼容性之外会有什么问题吗?"
我很好奇为什么有可能这样做(至少在Java 8上如此):
Optional.of(null).orElse("something");
Run Code Online (Sandbox Code Playgroud)
Optional.of(null)基本上是保证的空指针。使得对其进行调用.orElse()成为可能,使笨拙的开发人员意外陷入困境。我一直在四处看看是否有任何理由。也许在某些情况下这应该解决?
我知道Optional.ofNullable()值是否也可以为null。我的问题是,为什么还没有默认行为Optional.of()呢?如果值不能是null,为什么要放在Optional第一个?如果结果还是为空,那么无论如何您都会得到一个NPE。如果您Optional使用of()方法构造一个,那么您仍然会拥有Optional包装器的所有其他方法,只有在值可以为的情况下,它们才真正有目的null。
编辑:我已经阅读了为什么在Optional.ofNullable上使用Optional.of?在发布此消息之前,但答案是“因为您可以更快地发现错误,并且以这种方式进行跟踪更容易”。但是我有点不同意,也许您的堆栈跟踪中会包含一些额外的行,但是仍然很容易查明NPE的来源。