Optional.ofNullable() 是否应用于空值检查?
哪种空检查更可取?
Optional.ofNullable(port).ifPresent(settings::setPort);
或
if (port != null) {
settings.setPort(port);
}
哪种空检查更可取?
Optional.ofNullable(port).ifPresent(settings::setPort);
或
if (port != null) {
settings.setPort(port);
}
在 Java 中,值是指示存在或不存在的位的融合,其值为任意引用类型或基元 、 、 或 。Optional
T
int
long
double
当从方法返回值时,这些元素融合特别有用,因为方法只有一个返回值。通常需要使用特殊值(例如在引用类型的情况下)或 -1 作为哨兵来指示“无值”情况。用作返回值可避免调用方意外误用 sentinel 值作为实际返回值的问题。null
int
Optional
鉴于此,代码行如
Optional.ofNullable(port).ifPresent(settings::setPort);
奇怪的是,它将一个值与行的第一部分中的现在/不存在位融合在一起,然后立即在行的第二部分中将它们分开。这增加了最终相当简单的任务的复杂性:检查是否为非空并有条件地执行某些操作。替代代码段:port
if (port != null) {
settings.setPort(port);
}
非常清楚地表达了它的作用。
的确,if 语句比链占用更多的垂直空间。链条更密集,但也更难理解:一个糟糕的权衡。Optional
Optional
虽然,您在问题中发布的代码段只是避免丑陋的简单方法,但又有效,正确且无效。在这种情况下,请遵循您的个人偏好。null-check
Optional
的真正威力在于以下方法:
可选::filter(谓词<? super T>谓词
),它对现值应用滤镜。可选::map(Function<? super T,? 扩展 U> mapper
),它对现值应用映射函数。例如,假设您希望从中获取另一个值以添加到列表中,如果为:则避免NPE:port
port
null
Optional.ofNullable(port).map(port::getSomeValue).ifPresent(settings::setPort);
此外,请避免以下我经常看到的无意义的替换:null-check
if (Optional.ofNullable(port).isPresent()) {
settings.setPort(port);
}