Java 8可选.为什么和ofNullable?

had*_*des 16 java optional java-8

我有一个关于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检查?

Nam*_*man 19

Optional.of显式的读取的javadoc :

@throws NullPointerException if value is null
Run Code Online (Sandbox Code Playgroud)

这就是处理你所期望的案件的要求,其中使用Optional.ofNullable了一小段代码:

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value); // 'Optional.of'
}
Run Code Online (Sandbox Code Playgroud)

也就是说,选择一个比其他的决定仍然存在与应用程序设计,就好像您value也可能会被null与否.


在你期望的部分,这不是Optional实际的目的.API说明进一步阐明了这一点(格式化我的):

Optional主要用于方法返回类型,其中明确需要表示"无结果",并且使用 null可能导致错误.类型的变量本身不Optional应该null ; 它应该总是指向一个Optional实例.


Optional的目的是解决NullPointerException异常.

旁白:只是清楚地说出来,选择当然会隐含地让你定义是否应该在运行时抛出NPE.但是在编译时并没有确定.

  • 所以你不应该是`Optional.empty()指针`? (4认同)
  • @chrylis哦,我不想那么安全,我可以负担得起在运行时抛出.:) (3认同)

ETO*_*ETO 12

Optional的目的是解决NullPointerException异常问题

是的,它是,但在使用时不是在创造.

所以,当你收到一封Optional从一个方法,那么你可以通过使用避免NPE Optional.ifPresent,Optional.orElse,Optional.orElseGetOptional.orElseThrow方法.

但是,当您创建Optional时,情况并非如此.因为它是你自己的方法,你必须知道对象是否可以为空.


Optional的要点是为函数提供一种返回值的方法,以指示缺少返回值.见这个讨论.这允许调用者继续一系列流畅的方法调用.

斯图尔特马克斯

请阅读这篇文章以获得更详细的解释.


HPH*_*HPH 7

为什么人们会选择 Optional 而不是普通的 if-else 方法进行空检查?

Optional<T>类的主要目的是提供一种执行空安全映射操作的方法。

employeeOptional.map(Employee::getName).map(String::toUpperCase).ifPresent(upperCasedNameConsumer)

上面的表达式可以替换if-else单个可读表达式中的级联语句。

Optional.of为给定的参数提供一个null-null值为值的断言,否则,Optional.ofNullable如果您不确定输入,则可以选择。

我强烈建议您阅读class的javadocOptional<T>获取更多可选的链接方法,您可以利用这些方法获得优势。


Nul*_*ter 6

我认为使用Javadoc非常简单明了:

Optional.of(T value)当你确定永远不会有null值并且发生null值而不是程序抛出NullPointerException并将其视为bug时使用.

Optional.ofNullable(T value)当你知道可以有一个null值时使用,如果你知道它的程序应该正常运行.


为什么人们会选择Optional而不是普通的if-else方法进行空检查?


Jol*_*ker 5

在阅读了一些答案和评论之后,我认为这个解释是缺失的.考虑像这样的方法

public Optional<String> name(Customer c) {
    return c.isNew() ? Optional.ofNullable(getName(c)) : Optional.of(getName(c));
}
Run Code Online (Sandbox Code Playgroud)

NullPointerException如果客户不是新客户并且应该有一个名字,那么你想抛出一个; 你的代码是不一致的,如果有的话null.然而,如果客户是新客户,则该名称可能尚不存在,因此ofNullable在该情况下该方法返回Optional.