Java 是否应将可选的.ofNullable()用于空检查?
哪种空检查更可取Java 是否应将可选的.ofNullable()用于空检查?,java,lambda,java-8,null,optional,Java,Lambda,Java 8,Null,Optional,哪种空检查更可取 Optional.ofNullable(port).ifPresent(settings::setPort); 或 它取决于几个因素何时使用。 如果port是类中的一个属性,那么使用Optional可能有点过头了。(不要使用Optionals作为属性) 我认为Optionals在编写库时非常有用 public Optional<Integer> getPort() 尽管您在问题中发布的代码片段只是一种避免丑陋的空检查的简单方法,但它是有效的、正确的和空安全的。在
Optional.ofNullable(port).ifPresent(settings::setPort);
或
它取决于几个因素何时使用。 如果
port
是类中的一个属性,那么使用Optional
可能有点过头了。(不要使用Optional
s作为属性)
我认为Optional
s在编写库时非常有用
public Optional<Integer> getPort()
尽管您在问题中发布的代码片段只是一种避免丑陋的
空检查的简单方法,但它是有效的、正确的和空安全的。在这种情况下,请遵循您的个人偏好
真正的力量在于以下方法:
- 它对当前值应用过滤器
- 它对当前值应用映射函数李>
例如,假设您希望从端口
获取另一个值,以添加到列表中,并在端口
为空时避免NPE:
Optional.ofNullable(port).map(port::getSomeValue).ifPresent(settings::setPort);
此外,请避免以下我经常看到的对空检查的无意义替换:
if (Optional.ofNullable(port).isPresent()) {
settings.setPort(port);
}
在Java中,可选
值是表示存在或不存在的位与任意引用类型T
或原语int
、long
或double
的值的融合
当从方法返回值时,融合这些值特别有用,因为方法只有一个返回值。对于引用类型,通常需要使用特殊值,例如null
,对于int
,则需要使用-1,作为指示“无值”情况的哨兵。使用Optional
作为返回值可以避免调用者意外地误用sentinel值作为实际返回值的问题
鉴于此,代码行如
Optional.ofNullable(port).ifPresent(settings::setPort);
奇怪的是,它将一个值与行的第一部分中的当前/不存在位进行融合,然后在行的第二部分立即将其分离。这为最终相当简单的任务增加了复杂性:检查端口是否为非空,并有条件地执行某些操作。替代代码段:
if (port != null) {
settings.setPort(port);
}
非常清楚地表达了它的功能
的确,if语句比Optional
链占用更多的垂直空间。可选链更密集,但也更难理解:一个糟糕的权衡。谁更喜欢?这是一个基于意见的问题。哪一个会给计算机和下一个阅读代码的人的大脑带来更多的开销?这是基于观点的。但我更喜欢第二种选择。更具可读性。另外,可选的
还有另一个用途。只是为了一个如果
,我不会,至少对于或的使用,这会变得更有趣一点。@Kayaman这并不罕见。特别是当其中一些点可能相互作用时。返回null
通常是隐含的,因此这不会真正保证注释的正确性,也不会让返回null
感到意外Optional
也有它的位置,但它并不是返回null
@Kayaman的方法的自动替代品。也许我的示例过于简单,也是因为“simple”get方法。像其他任何东西一样,在有意义的地方使用它。但是可能有一些方法不那么含蓄,或者有一些参数让它更清晰。事实上,就像这个问题所显示的那样,有些人认为可选的
替代了空的
,而事实并非如此。有点像sopme,人们认为流是普通循环的替代品,通过用流替换循环来“改进”代码有问题。.map(Port::getSomeValue)
保持简单。你真的经常看到最后一点吗?真可悲!这是这里给出的唯一正确答案。它应该得到更多+1。Java8在运行中提升了Optional.ofNullable(port).ifPresent(settings::setPort)代码>使用的种类可选
。但是根据一些书籍的说法,Optional
存在严重的性能问题。所以它只能用作函数的返回值。@RavindraRanwala我完全不同意这一点-我们在代码中使用这种模式,不多,但我们确实这么做了。问题是,对于我们的团队来说,这显然更容易阅读(包括我自己)。可选的是语法糖,并自行承担费用。对于简单的空检查,最好使用传统的空检查
Optional.ofNullable(port).ifPresent(settings::setPort);
if (port != null) {
settings.setPort(port);
}