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.但是在编译时并没有确定.
ETO*_*ETO 12
Optional的目的是解决
NullPointerException异常问题
是的,它是,但在使用时不是在创造.
所以,当你收到一封Optional从一个方法,那么你可以通过使用避免NPE Optional.ifPresent,Optional.orElse,Optional.orElseGet和Optional.orElseThrow方法.
但是,当您创建Optional时,情况并非如此.因为它是你自己的方法,你必须知道对象是否可以为空.
Optional的要点是为函数提供一种返回值的方法,以指示缺少返回值.见这个讨论.这允许调用者继续一系列流畅的方法调用.
斯图尔特马克斯
请阅读这篇文章以获得更详细的解释.
为什么人们会选择 Optional 而不是普通的 if-else 方法进行空检查?
Optional<T>类的主要目的是提供一种执行空安全映射操作的方法。
employeeOptional.map(Employee::getName).map(String::toUpperCase).ifPresent(upperCasedNameConsumer)
上面的表达式可以替换if-else单个可读表达式中的级联语句。
Optional.of为给定的参数提供一个null-null值为值的断言,否则,Optional.ofNullable如果您不确定输入,则可以选择。
我强烈建议您阅读class的javadoc以Optional<T>获取更多可选的链接方法,您可以利用这些方法获得优势。
我认为使用Javadoc非常简单明了:
Optional.of(T value)当你确定永远不会有null值并且发生null值而不是程序抛出NullPointerException并将其视为bug时使用.
Optional.ofNullable(T value)当你知道可以有一个null值时使用,如果你知道它的程序应该正常运行.
为什么人们会选择Optional而不是普通的if-else方法进行空检查?
在阅读了一些答案和评论之后,我认为这个解释是缺失的.考虑像这样的方法
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.
| 归档时间: |
|
| 查看次数: |
2611 次 |
| 最近记录: |